{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "c2b8876c",
   "metadata": {},
   "source": [
    "| [02_lexical_analysis/01_中文分词.ipynb](https://github.com/shibing624/nlp-tutorial/tree/main/02_lexical_analysis/01_中文分词.ipynb)  | 中文分词工具  |[Open In Colab](https://colab.research.google.com/github/shibing624/nlp-tutorial/blob/main/02_lexical_analysis/01_中文分词.ipynb) |\n",
    "\n",
    "# Bert Embedding\n",
    "\n",
    "## 获取Bert模型的Embedding\n",
    "\n",
    "\n",
    "基于transformers库获取Bert模型的向量数据："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "outputs": [],
   "source": [
    "!pip install transformers"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "10e0b6c0",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "/Users/xuming/.pycorrector/datasets/bert_models/chinese_finetuned_lm\n",
      "token ok\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Some weights of the model checkpoint at /Users/xuming/.pycorrector/datasets/bert_models/chinese_finetuned_lm were not used when initializing BertModel: ['cls.predictions.transform.dense.weight', 'cls.predictions.bias', 'cls.predictions.transform.dense.bias', 'cls.predictions.transform.LayerNorm.bias', 'cls.predictions.transform.LayerNorm.weight', 'cls.predictions.decoder.weight', 'cls.seq_relationship.weight', 'cls.seq_relationship.bias']\n",
      "- This IS expected if you are initializing BertModel from the checkpoint of a model trained on another task or with another architecture (e.g. initializing a BertForSequenceClassification model from a BertForPreTraining model).\n",
      "- This IS NOT expected if you are initializing BertModel from the checkpoint of a model that you expect to be exactly identical (initializing a BertForSequenceClassification model from a BertForSequenceClassification model).\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "model ok\n",
      "BaseModelOutputWithPoolingAndCrossAttentions(last_hidden_state=tensor([[[ 0.0462,  0.5329,  0.1521,  ...,  0.1440, -0.4105,  0.2640],\n",
      "         [ 0.3368,  0.5288, -0.5288,  ...,  0.0241, -0.0017,  0.6836],\n",
      "         [ 0.8783, -0.7624, -0.3651,  ..., -0.1129, -0.1835,  0.4492],\n",
      "         ...,\n",
      "         [ 1.1596,  0.7187, -0.4550,  ...,  0.4255, -1.0546,  0.4000],\n",
      "         [ 0.3089,  0.1456, -0.7718,  ..., -0.3547, -1.1788, -0.1022],\n",
      "         [-0.1397,  0.1891,  0.0370,  ..., -0.4032,  0.1067,  0.8418]]],\n",
      "       grad_fn=<NativeLayerNormBackward>), pooler_output=tensor([[ 0.9999,  1.0000,  1.0000,  0.9994,  0.9917,  0.9673, -0.9951, -0.9998,\n",
      "          0.7602, -0.9998,  1.0000,  0.8789, -0.9962, -0.9991,  0.9999, -0.9998,\n",
      "         -0.9808,  0.9962,  0.9995, -0.8180,  1.0000, -1.0000, -0.7954,  0.9890,\n",
      "         -0.0880,  0.9994,  0.9973, -0.9975, -1.0000,  0.9999,  0.9937,  0.9998,\n",
      "          0.7745, -1.0000, -1.0000,  0.9997,  0.7679,  0.9995,  0.9810, -0.8222,\n",
      "         -0.9881, -0.9682,  0.4597, -1.0000, -0.9997,  0.9258, -1.0000, -1.0000,\n",
      "         -0.6581,  1.0000, -0.9976, -1.0000, -0.8982,  0.9489, -0.9080,  0.9993,\n",
      "         -1.0000,  0.9999,  1.0000,  0.9088,  0.9998, -1.0000,  0.9745, -0.9999,\n",
      "          1.0000, -0.9999, -0.9999,  0.9022,  1.0000,  1.0000,  0.9859,  0.9994,\n",
      "          1.0000,  0.9899,  0.9669,  0.9610, -0.9999,  0.9868, -1.0000,  0.3895,\n",
      "          1.0000,  0.9917, -0.9991,  0.9879, -0.9999, -1.0000, -0.9998,  1.0000,\n",
      "         -0.9313,  1.0000,  1.0000, -0.9998, -1.0000,  0.9967, -0.9996, -0.9954,\n",
      "         -0.9987,  0.9998,  0.3839, -0.9951,  0.5363, -0.0769, -0.6780, -0.9602,\n",
      "          0.9937,  0.9996,  0.9477, -0.9996,  0.9999, -0.9088, -1.0000, -0.9984,\n",
      "         -0.9999, -0.9949, -0.9994,  1.0000, -0.5663, -0.9630,  0.9999, -0.9999,\n",
      "          0.9980, -1.0000, -0.9767, -0.9776,  0.9995,  1.0000,  0.9999, -0.9992,\n",
      "          0.7933,  1.0000,  0.9947,  0.9999, -1.0000,  0.9998,  0.9886, -0.9998,\n",
      "         -0.6499, -0.9700,  1.0000,  0.9997,  0.9998, -0.9993,  0.9999, -1.0000,\n",
      "          1.0000, -1.0000,  1.0000, -1.0000, -0.9996,  1.0000,  0.5835,  1.0000,\n",
      "          0.4881,  1.0000, -0.9987, -1.0000,  0.2071,  0.9841,  0.9772, -1.0000,\n",
      "          0.9966, -0.9978, -0.0712, -0.8875, -1.0000,  1.0000, -0.9943,  1.0000,\n",
      "          0.9936, -0.9993, -0.9932, -0.9999, -0.7205, -0.9999, -0.9955,  0.9945,\n",
      "         -0.6264,  0.9999, -0.9988, -0.9974,  0.9961, -0.9993, -1.0000,  0.9997,\n",
      "         -0.9633,  0.9966,  0.9968, -0.8558,  0.1031, -0.9476, -0.9900,  1.0000,\n",
      "          0.9906,  0.9335,  0.9998,  0.5868, -0.9853, -0.9261, -1.0000, -0.9779,\n",
      "          1.0000, -0.9802, -1.0000,  0.9919, -1.0000,  0.5570, -0.9243, -0.9926,\n",
      "         -0.9998, -0.9999,  0.9982, -0.3304, -0.9999,  0.9972,  0.7547, -0.7263,\n",
      "         -1.0000,  0.9684,  0.9999,  0.9794,  0.9992, -0.9990, -1.0000,  0.9999,\n",
      "         -0.9994, -0.9656,  0.9782,  1.0000,  0.9999,  0.8883,  0.9906,  1.0000,\n",
      "          0.8663, -1.0000,  0.9902, -1.0000, -0.9686,  1.0000, -0.9999,  0.9714,\n",
      "          1.0000,  0.9804,  1.0000, -0.9932, -1.0000, -0.9999,  1.0000,  0.9992,\n",
      "          1.0000, -0.9994, -1.0000, -0.7841, -0.9982, -1.0000, -1.0000,  0.5399,\n",
      "          0.9999,  1.0000,  0.9529, -0.9999, -0.9983, -0.9997,  1.0000, -0.9995,\n",
      "          1.0000,  0.9985, -0.9990, -0.9984,  0.4102, -0.9887, -0.9999,  0.9476,\n",
      "         -1.0000, -0.9998, -1.0000,  0.5216, -0.9999, -1.0000,  0.9927,  1.0000,\n",
      "          0.9832, -1.0000,  1.0000,  1.0000,  0.6493, -0.9897,  0.9987, -1.0000,\n",
      "          1.0000, -0.9998,  0.9992, -0.9910, -0.9988,  0.6841,  1.0000,  0.9991,\n",
      "         -0.0945, -0.8882, -0.9999, -0.9984,  0.6373,  0.9962, -0.9928,  0.9837,\n",
      "         -0.9835, -0.5475, -0.6533, -0.9646, -1.0000,  0.9946,  1.0000, -0.9937,\n",
      "          1.0000,  0.9995,  1.0000,  0.9988, -0.9979,  0.9999, -0.9568, -0.9371,\n",
      "         -0.9975, -0.9796,  0.9989,  0.9934, -0.9996, -1.0000,  1.0000, -0.4073,\n",
      "          0.0726,  0.9991, -0.9819,  0.7489,  0.9996, -0.9997,  0.9989, -0.9999,\n",
      "         -0.9999,  0.9999,  1.0000,  0.9999,  0.7050, -0.9942,  0.9992, -1.0000,\n",
      "          0.9998, -1.0000,  0.9999,  0.7262,  0.9978, -0.9997, -0.9997,  1.0000,\n",
      "          0.9191, -0.7063,  0.9999, -0.9997,  0.9823,  0.9794,  0.9979,  0.9994,\n",
      "          0.9998,  1.0000, -0.4151, -0.4769, -0.9945, -0.9979, -0.9999, -1.0000,\n",
      "          0.9442, -1.0000, -0.9992, -0.5763, -0.9380,  0.9991, -0.9614,  0.9741,\n",
      "         -0.9200,  0.7585, -0.6832,  0.7789,  0.9100, -0.9990, -0.9997, -1.0000,\n",
      "         -0.9996,  0.9937,  1.0000, -1.0000,  1.0000, -1.0000, -0.9945,  0.9909,\n",
      "         -0.9975, -0.9766,  0.9982, -1.0000,  0.9968,  1.0000,  1.0000,  0.9997,\n",
      "          1.0000, -0.0377, -0.9999, -0.9999, -1.0000, -1.0000, -1.0000,  0.9967,\n",
      "          0.5768, -1.0000, -0.9999,  0.9974,  1.0000,  0.9999, -1.0000, -0.9960,\n",
      "         -1.0000, -1.0000,  0.9998, -1.0000, -1.0000,  0.8403,  0.2925,  1.0000,\n",
      "         -0.7300,  0.9968,  0.9721, -0.8463,  0.9994, -1.0000,  0.9960,  1.0000,\n",
      "          0.9902, -1.0000, -0.8275, -0.3285, -1.0000, -0.5722,  0.9921,  1.0000,\n",
      "         -1.0000, -0.9919, -0.9993,  0.9939,  0.9998,  1.0000,  0.9999,  0.9973,\n",
      "          0.9966,  0.9990, -0.2278,  1.0000,  0.9019, -0.9999,  1.0000, -0.9931,\n",
      "          0.3810, -0.9970,  1.0000,  0.9909,  1.0000,  0.9994,  0.0773, -0.8879,\n",
      "         -1.0000,  0.9805,  1.0000, -0.9960, -0.9988, -1.0000, -0.9999, -0.9999,\n",
      "         -0.9837,  0.9481, -0.9999, -0.9999, -0.2732,  0.8276,  1.0000,  1.0000,\n",
      "          0.9999, -0.9998, -0.9134,  0.9975, -0.9959,  0.9502, -0.9299, -1.0000,\n",
      "         -0.9998, -0.9908,  1.0000, -0.9984,  0.8839, -0.9043,  0.9909,  0.9980,\n",
      "         -1.0000, -0.9808, -0.9997,  0.9978,  1.0000, -1.0000,  0.9995, -0.9992,\n",
      "          0.9993,  0.9830,  0.9992,  0.9999, -0.9392, -0.6955, -0.8634, -0.6895,\n",
      "          0.9410,  0.9981, -1.0000, -0.6234,  1.0000, -0.9660,  0.9999,  0.5241,\n",
      "          0.2568,  0.9977,  1.0000,  0.9999,  1.0000,  0.9980,  0.9982,  1.0000,\n",
      "          0.5588,  0.9976, -0.4912, -0.9997,  0.9614, -0.1142,  1.0000, -0.9842,\n",
      "         -0.9951, -1.0000,  0.8644,  1.0000,  1.0000, -0.9995,  0.9998,  0.8025,\n",
      "          0.6844,  0.9762,  0.9916,  0.9893,  0.3525,  0.9999,  1.0000, -1.0000,\n",
      "         -0.9999, -1.0000,  1.0000,  0.9998, -0.9740, -1.0000,  0.9999, -0.9981,\n",
      "          0.3949,  0.9960,  0.9281, -0.9850,  0.8734, -1.0000, -0.1166,  0.9119,\n",
      "          0.9983, -0.9729,  0.9999, -0.9999,  0.9485,  1.0000, -0.9886,  1.0000,\n",
      "          0.3598, -1.0000,  1.0000, -1.0000, -0.9999, -0.1344,  1.0000,  0.9999,\n",
      "          0.9721, -0.9948,  1.0000, -1.0000,  1.0000, -1.0000, -0.9784, -0.9999,\n",
      "          1.0000, -0.9999, -0.9995, -0.9961,  0.9934, -0.6841, -0.9959,  1.0000,\n",
      "          0.9830, -0.0785,  0.0016, -0.9982, -0.9997, -0.9993, -0.9789, -1.0000,\n",
      "          0.9880,  0.6295, -0.9854, -0.9989, -1.0000,  1.0000,  0.9102, -0.9993,\n",
      "          1.0000,  0.6416, -1.0000,  0.9998, -1.0000,  0.9974,  0.9995,  0.9282,\n",
      "          0.9281, -1.0000,  0.9451,  1.0000, -0.9977, -0.1010, -0.8494, -0.9989,\n",
      "          0.9680,  0.9994,  0.9994, -0.9982,  0.9991,  0.9782,  0.9994, -0.9993,\n",
      "          0.5694, -1.0000, -0.9947, -0.9771, -0.5015, -1.0000, -1.0000,  1.0000,\n",
      "          1.0000,  1.0000, -0.9997, -0.9630,  0.9945,  0.9997, -0.9997, -0.5486,\n",
      "         -0.4082,  0.9995,  0.9815, -0.9995, -0.9222, -1.0000, -0.9999,  0.8829,\n",
      "          0.9606,  0.9846,  1.0000,  1.0000, -0.9993, -0.9850, -1.0000, -1.0000,\n",
      "          1.0000,  0.9998,  1.0000, -0.9935, -0.9935,  1.0000, -0.9598, -0.9793,\n",
      "         -0.9996, -1.0000, -1.0000,  0.9801, -0.9996, -1.0000,  0.9997,  1.0000,\n",
      "          0.2486, -1.0000, -0.9970,  1.0000,  1.0000,  1.0000,  0.9682,  1.0000,\n",
      "         -0.9981,  0.9991, -0.9999,  1.0000, -1.0000,  1.0000,  1.0000,  0.9988,\n",
      "          0.9996, -0.9998,  0.9529, -1.0000,  0.9445,  0.9934, -0.9129, -0.9996,\n",
      "          0.7888, -0.7471, -0.9998,  1.0000,  0.9782, -0.9456,  0.9992,  0.8537,\n",
      "          1.0000, -0.7332, -1.0000,  0.8291,  0.9964,  0.9996,  1.0000,  0.9961,\n",
      "          1.0000, -0.9619, -0.9998,  0.9999, -0.9962, -0.9640, -1.0000,  1.0000,\n",
      "          0.9997, -1.0000, -0.9990, -0.0881,  0.9771,  1.0000,  0.9998,  0.9856,\n",
      "          0.9443,  0.7739,  0.9998, -1.0000,  0.9999, -0.9997, -0.9957,  1.0000,\n",
      "         -0.9999,  0.9999, -0.9997,  0.9967, -1.0000,  0.3715,  0.9992,  0.9983,\n",
      "         -0.9992,  1.0000,  0.9850, -0.9977, -0.9998, -0.9996, -0.9993,  0.9992]],\n",
      "       grad_fn=<TanhBackward>), hidden_states=None, past_key_values=None, attentions=None, cross_attentions=None)\n",
      "tensor([[ 4.2115e-01,  2.3145e-01, -2.0698e-01, -9.7974e-02,  4.9489e-01,\n",
      "          2.7838e-01, -1.1931e-01,  1.2249e-01,  5.7828e-01, -1.4129e-02,\n",
      "         -2.6775e-01,  9.0389e-02,  1.0490e-01,  2.3848e-01,  2.4841e-01,\n",
      "         -5.6864e-01, -1.8439e-01, -1.8489e-01, -5.0514e-01,  1.3315e-01,\n",
      "          4.9129e-01,  1.8245e-01, -2.6851e-01, -1.0386e+00, -7.9079e-01,\n",
      "          1.4436e-01,  4.9574e-01, -9.7085e-02,  8.0020e-01, -4.6640e-01,\n",
      "         -2.6626e-01, -2.8174e-01, -3.6215e-01,  5.1038e-01,  6.0100e-01,\n",
      "         -4.5917e-01,  1.0059e-01, -3.4047e-01,  1.1231e-01,  1.1119e-01,\n",
      "          2.3894e-01,  1.1199e-01,  1.9337e-01, -6.2538e-01, -7.4717e-02,\n",
      "         -1.2579e-01,  6.5073e-01,  6.4615e-01, -5.8761e-02,  2.2246e-01,\n",
      "         -2.5051e-01,  8.6206e+00,  1.4232e-02,  2.9667e-01, -1.3845e+00,\n",
      "          1.1278e-01,  5.9608e-01,  5.9820e-02,  2.9962e-01, -2.5438e-01,\n",
      "          2.8564e-02, -6.6922e-01,  3.6433e-01, -2.8556e-01, -7.1027e-01,\n",
      "          1.4349e-01, -3.9762e-01,  2.2639e-01, -2.6528e-01, -9.4360e-02,\n",
      "          4.1309e-01,  3.2021e-01, -9.2431e-04,  1.7673e-01, -3.3852e-01,\n",
      "          8.5758e-01,  3.5135e-02, -5.2421e-01,  4.9388e-01, -1.5129e-01,\n",
      "         -1.0801e+00, -1.6625e-01, -5.9788e-01, -8.1008e-02, -4.5741e-01,\n",
      "         -8.6737e-02, -1.0806e+00, -2.2317e+00,  8.1670e-01,  2.4053e-01,\n",
      "          3.0503e-03, -3.6126e-02, -2.3908e-01,  5.5755e-02,  5.4440e-01,\n",
      "          3.0456e-01,  3.7178e-01,  2.6597e-02, -1.2701e-01,  7.3959e-01,\n",
      "         -1.6025e-01,  1.2154e+00, -6.3310e-01,  1.2381e+00, -2.8937e-01,\n",
      "          3.7735e-01,  4.1021e-01, -3.5903e-02, -8.0253e-01,  1.5286e-02,\n",
      "         -7.4596e-01, -1.5062e-01, -2.4371e-01,  2.9766e-01, -2.5416e-02,\n",
      "          2.2347e-01, -1.2874e-01,  1.6149e-01, -7.6719e-01, -2.2865e-01,\n",
      "          8.2740e-02,  5.8240e-01,  5.9125e-01, -9.1472e-01,  1.8059e-02,\n",
      "         -8.7869e-01, -2.0138e-01,  2.2510e-01,  2.0105e-01,  5.2098e-01,\n",
      "          1.6654e-01, -7.5824e-03, -7.6159e-01,  3.6377e-01,  8.5763e-01,\n",
      "         -4.7668e-01,  7.9492e-01, -1.3293e-01, -9.8156e-01, -5.2239e-02,\n",
      "         -1.1053e-01, -2.3038e-01, -1.8885e-01,  5.8654e-02, -7.5244e-02,\n",
      "          5.7493e-01, -5.8966e-01, -8.3426e-01, -9.1647e-02, -3.9919e-01,\n",
      "         -5.9551e-01, -3.8223e-01, -3.9354e-01, -1.2872e+00,  1.7037e-01,\n",
      "          6.2567e-02,  3.7266e-01, -4.3533e-01, -1.5423e-01,  8.6063e-02,\n",
      "          1.4821e-02, -5.9938e-01,  1.2751e-01,  3.0867e-01,  2.7782e-01,\n",
      "         -1.0011e+00,  8.3422e-01, -1.4378e-01, -4.3895e-01, -1.1647e-01,\n",
      "          3.4525e-01, -3.5967e-01,  3.6654e-01, -5.9473e-01, -3.9539e-01,\n",
      "          2.7654e-01,  5.3645e-02, -8.5819e-01, -2.1018e-01, -1.4444e+00,\n",
      "          1.9370e-01, -7.4787e-01,  6.9408e-01, -2.7827e-01,  1.2964e-01,\n",
      "         -8.9586e-02, -2.4729e-01,  3.4385e-01, -7.2835e-01,  1.0293e-01,\n",
      "          6.1057e-01,  1.2272e-01, -1.1748e+00,  2.0129e-01,  5.6979e-01,\n",
      "          2.6674e-02, -5.0832e-01,  3.2063e-01,  8.4628e-01,  8.5049e-01,\n",
      "         -1.0433e-02, -1.0727e+00, -9.1567e-01,  2.1140e-01,  3.1516e-01,\n",
      "          6.1549e-01,  4.2327e-01, -1.0585e-01, -4.5701e-01,  9.7370e-01,\n",
      "          5.0359e-01, -4.9752e-02,  3.3154e-01,  1.8237e-01,  1.4244e-01,\n",
      "          1.8660e-01,  2.9726e-01, -5.3041e-01,  1.0201e-02, -2.2264e-01,\n",
      "          1.1000e-01,  1.0814e-01,  6.9984e-01,  2.5458e-01, -3.6922e-02,\n",
      "          1.8352e-02,  6.2996e-01, -1.2013e-02, -5.9554e-01,  6.6884e-02,\n",
      "         -4.9590e-01, -1.5742e-01, -6.2079e-02, -3.6228e-01, -4.4048e-01,\n",
      "          4.2865e-01,  4.4279e-02, -6.4402e-01, -7.8738e-01, -4.3361e-02,\n",
      "          2.1974e-01, -3.6023e-01, -1.1008e+00,  5.3952e-02, -3.6299e-01,\n",
      "          2.6865e-01,  1.3385e-01,  1.9683e-01, -1.7107e-01,  2.3446e-01,\n",
      "         -2.2911e-01, -5.3821e-01, -1.9867e-01, -1.3766e+00, -2.4666e-01,\n",
      "          6.4289e-01, -6.9668e-01, -7.4800e-01, -5.5722e-01, -4.4907e-01,\n",
      "         -1.3621e-01,  4.2140e-01,  9.5960e-01,  4.4360e-01,  3.7554e-01,\n",
      "         -1.8354e-01,  9.7835e-02, -5.5753e-01, -3.2415e-01, -8.0041e-02,\n",
      "          4.4006e-01,  2.6940e-01, -3.0654e-01, -2.3054e-01, -5.2161e-01,\n",
      "         -6.4866e-02,  4.9422e-01,  7.5057e-01,  1.8852e-01, -3.3040e-01,\n",
      "          1.2468e+00,  2.9247e-02, -6.6896e-01, -9.5220e-02, -5.9996e-01,\n",
      "         -1.9553e-01,  3.8359e-02,  3.2242e-01, -1.8793e-01, -5.3541e-02,\n",
      "         -3.1233e-01,  3.8802e-01,  1.3228e-01,  1.0668e+00,  1.8578e+00,\n",
      "         -8.0071e-01,  1.2525e-01, -4.9549e-01,  2.0179e-01, -8.4097e-01,\n",
      "          1.8610e-01, -4.7953e-02, -3.0395e-01,  8.5403e-01, -5.3822e-02,\n",
      "         -5.0801e-01,  8.2333e-01,  5.0291e-01, -9.3993e-01, -4.6249e-01,\n",
      "         -4.1557e-01, -2.2973e-01, -2.2915e-01, -6.1189e-01, -2.7792e-01,\n",
      "          3.9598e-01, -3.4302e-01,  6.4712e-01,  2.2012e-01,  4.4055e-01,\n",
      "         -4.4096e-01,  6.9280e-02, -2.8966e-01,  1.0388e+00, -1.1961e-01,\n",
      "         -8.2877e-02, -1.4306e-01,  2.9727e-01, -1.2053e-01,  7.9857e-01,\n",
      "          9.0278e-03, -1.5312e-01, -5.4600e-01,  8.1083e-01,  1.1571e+00,\n",
      "         -3.9596e-01,  6.7261e-01,  4.7498e-01, -7.7686e-01, -2.9285e-01,\n",
      "         -1.5991e-01,  1.4495e-01,  2.2916e-01,  5.6729e-02, -1.9356e-01,\n",
      "          4.4161e-01,  4.0350e-01,  6.1182e-01,  4.2114e-01, -3.9481e-01,\n",
      "         -6.3641e-01,  5.6452e-02, -8.1091e-01, -1.0415e-03, -4.5391e-01,\n",
      "          1.7060e+00, -4.5662e-01,  5.8219e-02,  1.4496e+00, -1.3005e-01,\n",
      "          1.2138e-01,  1.8672e-01, -4.0238e-01, -2.9981e-01,  2.5241e-01,\n",
      "         -2.9240e-01, -4.5109e-02, -6.0901e-01,  7.5708e-01, -5.5898e-01,\n",
      "          6.4741e-01,  5.7061e-01, -5.5011e-01, -7.6833e-01, -1.2637e-01,\n",
      "         -4.7630e-01,  3.6280e-01, -1.6268e-01,  4.3015e-01,  3.1131e-02,\n",
      "         -1.7380e-01, -2.1078e-01, -6.3284e-02, -7.5465e-01, -1.6997e-01,\n",
      "          4.2476e-03,  4.7350e-01, -9.3531e-01, -1.1029e-01, -1.9922e-01,\n",
      "          4.4874e-01, -1.3953e-01, -6.0780e-01, -9.7392e-02,  5.7029e-01,\n",
      "          1.0055e+00,  2.3331e-01, -8.8975e-02, -6.3464e-02,  1.2084e+00,\n",
      "          7.7065e-01, -1.1713e-01,  1.7554e-01, -7.2155e-01,  7.5222e-02,\n",
      "          3.6250e-01,  4.5526e-01,  6.7044e-01,  2.8244e-01, -1.2149e+00,\n",
      "         -1.1918e+00,  2.2679e-01,  9.8096e-01,  2.1820e-01,  1.4098e-01,\n",
      "         -1.7236e-01,  2.2309e-01,  1.5257e-01,  6.6268e-01, -1.0398e-01,\n",
      "         -3.0996e-01,  7.0454e-01, -2.6190e-01, -1.0244e-01,  6.4382e-01,\n",
      "         -4.8694e-01, -5.3009e-01,  2.8935e-01, -5.8808e-01, -1.4827e-01,\n",
      "         -8.6694e-01, -7.6132e-02,  2.6520e-01, -6.9277e-01,  7.4502e-01,\n",
      "          8.5377e-01, -3.6214e-01,  4.8850e-01, -3.8880e-01,  5.1802e-01,\n",
      "         -3.7141e-01, -7.7974e-01,  6.9056e-01, -4.9195e-01,  1.2370e-01,\n",
      "          5.5867e-01,  6.1279e-01, -3.0551e-01,  6.3116e-01, -2.2843e-01,\n",
      "          7.1648e-02, -4.6328e-01, -5.1349e-01, -3.3412e-01,  1.8214e-01,\n",
      "         -6.5556e-01,  4.2179e-01,  6.4876e-01,  6.9453e-02,  1.9235e-01,\n",
      "         -3.9381e-01,  1.8176e-01,  2.6222e-01,  4.9721e-01,  4.9734e-01,\n",
      "          3.7234e-02, -4.3901e-01, -1.4314e-01,  7.3539e-01, -3.5594e-02,\n",
      "          1.0551e-01,  8.7454e-02,  1.1364e-01,  6.1150e-01, -4.7138e-01,\n",
      "          1.0484e-01, -1.5497e-01, -1.4640e-02, -1.2692e+00,  8.9682e-03,\n",
      "          1.6948e-01, -8.3116e-01,  1.3112e+00, -8.9783e-01,  7.2376e-01,\n",
      "          3.6621e-01,  1.6011e-01,  1.2368e-02, -6.5463e-01, -4.1486e-02,\n",
      "         -9.6702e-01, -2.8059e-01,  2.6916e-01,  6.7283e-01, -5.2141e-01,\n",
      "         -2.5983e-01,  1.8001e-01,  1.0120e-01, -2.0587e-01, -4.9314e-01,\n",
      "         -6.8490e-01, -1.5255e+00,  1.8295e-01, -2.5930e-01, -1.2546e+00,\n",
      "         -6.9589e-02,  4.3109e-01, -2.0969e-03, -3.3771e-01,  3.5798e-01,\n",
      "          9.4842e-01, -4.0370e-01, -5.9110e-01, -3.0457e-02,  8.6064e-01,\n",
      "          2.0668e-01, -3.9533e-02, -1.1155e+00,  1.6056e-01, -6.5845e-01,\n",
      "          8.1298e-01, -6.7716e-01,  7.3191e-01, -6.5307e-03, -8.2889e-01,\n",
      "          2.2935e-01, -1.0802e+00, -2.7448e-01,  1.6502e-01,  6.5893e-01,\n",
      "         -2.7223e-01, -7.5991e-02,  2.9284e-01, -5.6872e-01,  6.5480e-01,\n",
      "          7.2337e-02,  1.8865e-01, -1.0025e+00, -3.8879e-01, -6.7788e-01,\n",
      "         -1.2397e-01, -3.5319e-01, -2.9062e-01, -2.1113e+00, -2.8191e-01,\n",
      "         -7.8004e-01,  1.7187e-01,  7.2854e-01, -1.2840e-01,  1.7805e-01,\n",
      "         -9.9737e-01,  6.6500e-01, -1.1308e+00,  8.9093e-02, -7.6484e-02,\n",
      "         -3.3015e-01, -8.3024e-03,  2.0718e-01,  1.5108e-01, -4.2013e-01,\n",
      "          2.6676e-01, -7.4054e-02,  3.5822e-01, -5.4754e-01, -6.3731e-01,\n",
      "          1.6186e-01, -3.3157e-01,  4.8395e-01, -3.2022e-01, -7.7350e-01,\n",
      "          7.0298e-01,  1.9313e-01, -1.4782e+00,  1.6191e-01,  7.8461e-01,\n",
      "          7.4405e-01, -4.7152e-01,  9.6684e-02,  6.4955e-01, -3.2820e-01,\n",
      "          7.1990e-01,  1.3264e+00, -4.5643e-01,  3.7712e-01,  3.0739e-01,\n",
      "          4.9210e-01, -8.8734e-01,  7.0449e-01,  4.2371e-01, -6.9552e-01,\n",
      "         -4.3504e-01,  7.1409e-02, -3.4701e-01,  1.1066e-01, -6.0244e-01,\n",
      "          4.9574e-02, -1.2310e-01, -2.2023e-01, -8.0928e-01,  1.0534e-01,\n",
      "          2.8099e-01, -4.2681e-01,  4.7401e-02,  1.5718e-01,  3.3319e-01,\n",
      "         -6.7182e-01,  7.1283e-01,  1.1922e+00, -9.8483e-02,  1.4709e-02,\n",
      "          7.8795e-01,  3.9003e-01,  7.0789e-02, -5.5820e-01, -1.6251e-01,\n",
      "          4.7181e-01, -4.2967e-01,  2.4140e-01, -1.6781e-01, -7.4418e-01,\n",
      "          4.0156e-01,  1.0813e+00,  5.5052e-01, -4.2373e-01, -6.1423e-01,\n",
      "         -1.7941e-01,  2.7244e-02,  4.9143e-01,  2.2138e-01, -7.6815e-01,\n",
      "         -8.6145e-01,  4.8813e-01, -8.6220e-01,  4.5893e-01, -1.9819e-02,\n",
      "          1.0818e-01, -4.0966e-01,  7.4174e-01, -3.6610e-01,  2.1310e-02,\n",
      "          8.0221e-01, -1.8562e-01,  5.8339e-02,  4.0976e-01,  7.0982e-01,\n",
      "         -3.1056e-01,  1.5611e-01,  8.4351e-02,  1.8569e-01, -1.6442e-02,\n",
      "          6.1764e-01, -5.8446e-02, -3.6498e-01,  4.0751e-01, -3.0788e-01,\n",
      "         -9.5406e-02,  7.1717e-01,  2.4616e-01, -3.7505e-01, -2.1185e-01,\n",
      "          3.5740e-01, -4.4704e-01, -1.9303e-01, -2.2978e-02, -1.7094e-01,\n",
      "         -5.1454e-01, -7.2254e-01, -7.0447e-01,  2.7950e-01,  6.4648e-01,\n",
      "          7.6261e-01, -3.2582e-01,  1.0665e+00, -8.2867e-01,  3.0364e-01,\n",
      "         -3.7458e-02, -7.8399e-01, -2.0923e-01, -2.5211e-01, -2.0208e-01,\n",
      "          2.0298e-01, -6.1091e-01, -1.8543e-01, -5.2403e-01,  1.6102e-05,\n",
      "          5.4596e-01, -9.8686e-01, -3.3052e-01,  3.0897e-01,  4.7233e-01,\n",
      "          3.8098e-02,  9.4033e-01,  3.2290e-01,  8.6697e-03, -2.4415e-01,\n",
      "          3.9516e+00, -4.7525e-01,  7.1882e-01,  2.5092e-01, -1.0444e-01,\n",
      "          1.9712e-01,  7.1822e-01, -1.3286e-01, -3.0513e-01, -1.0075e-01,\n",
      "          6.1207e-02, -3.2429e-01, -4.3805e-01,  2.2502e-01,  3.1385e-03,\n",
      "         -8.6180e-01, -5.3833e-01,  2.1707e-01, -8.0439e-02, -1.5623e-01,\n",
      "          1.3789e+00,  2.2651e-01, -6.3904e-01, -5.1710e-01, -6.7277e-01,\n",
      "         -6.8123e-01, -4.4332e-01,  1.1069e+00,  3.0457e-01, -4.2791e-01,\n",
      "         -2.5976e-01, -4.9940e-01,  8.8210e-02,  5.7401e-01, -1.2304e-01,\n",
      "         -5.9881e-01,  4.9584e-01,  1.1418e-01,  3.9800e-01,  3.0608e-02,\n",
      "          8.9072e-01,  2.0687e-01,  2.7497e-01,  1.6121e-01,  1.1269e+00,\n",
      "         -3.1077e-01, -1.0664e+00, -1.5314e-01, -4.9027e-01,  1.9091e-01,\n",
      "          3.8845e-01,  1.7292e-01, -6.2660e-01, -1.0976e-01,  5.3393e-01,\n",
      "         -6.6391e-01,  5.6167e-01,  8.1336e-01, -3.8901e-04,  1.5196e-01,\n",
      "         -3.2085e-01,  2.7172e+00, -5.1197e-01,  9.2552e-01, -4.9456e-01,\n",
      "         -3.3745e-01,  2.8565e-01,  2.3598e-01, -1.4363e-01,  1.5846e-01,\n",
      "         -8.3368e-02, -4.9820e-01,  5.0628e-01]], grad_fn=<MeanBackward1>)\n",
      "torch.Size([1, 768])\n"
     ]
    }
   ],
   "source": [
    "import os\n",
    "\n",
    "import numpy as np\n",
    "import torch\n",
    "from transformers import AutoModel, AutoTokenizer\n",
    "\n",
    "os.environ[\"KMP_DUPLICATE_LIB_OK\"] = \"TRUE\"\n",
    "model_dir = os.path.expanduser('~/.pycorrector/datasets/bert_models/chinese_finetuned_lm')\n",
    "print(model_dir)\n",
    "tokenizer = AutoTokenizer.from_pretrained(model_dir)\n",
    "print(\"token ok\")\n",
    "model = AutoModel.from_pretrained(model_dir)\n",
    "print(\"model ok\")\n",
    "# tensor([[ 101, 3217, 4697,  679, 6230, 3236,  102]])\n",
    "inputs = tokenizer('春眠不觉晓', return_tensors='pt')\n",
    "outputs = model(**inputs)  # shape (1, 7, 768)\n",
    "print(outputs)\n",
    "v = torch.mean(outputs[0], dim=1)  # shape (1, 768)\n",
    "print(v)\n",
    "print(v.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "id": "82e41581",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'input_ids': tensor([[ 101, 3217, 4697,  679, 6230, 3236,  102]]), 'token_type_ids': tensor([[0, 0, 0, 0, 0, 0, 0]]), 'attention_mask': tensor([[1, 1, 1, 1, 1, 1, 1]])}"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "inputs"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "id": "d11ff8bc",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "BaseModelOutputWithPoolingAndCrossAttentions(last_hidden_state=tensor([[[ 0.0462,  0.5329,  0.1521,  ...,  0.1440, -0.4105,  0.2640],\n",
       "         [ 0.3368,  0.5288, -0.5288,  ...,  0.0241, -0.0017,  0.6836],\n",
       "         [ 0.8783, -0.7624, -0.3651,  ..., -0.1129, -0.1835,  0.4492],\n",
       "         ...,\n",
       "         [ 1.1596,  0.7187, -0.4550,  ...,  0.4255, -1.0546,  0.4000],\n",
       "         [ 0.3089,  0.1456, -0.7718,  ..., -0.3547, -1.1788, -0.1022],\n",
       "         [-0.1397,  0.1891,  0.0370,  ..., -0.4032,  0.1067,  0.8418]]],\n",
       "       grad_fn=<NativeLayerNormBackward>), pooler_output=tensor([[ 0.9999,  1.0000,  1.0000,  0.9994,  0.9917,  0.9673, -0.9951, -0.9998,\n",
       "          0.7602, -0.9998,  1.0000,  0.8789, -0.9962, -0.9991,  0.9999, -0.9998,\n",
       "         -0.9808,  0.9962,  0.9995, -0.8180,  1.0000, -1.0000, -0.7954,  0.9890,\n",
       "         -0.0880,  0.9994,  0.9973, -0.9975, -1.0000,  0.9999,  0.9937,  0.9998,\n",
       "          0.7745, -1.0000, -1.0000,  0.9997,  0.7679,  0.9995,  0.9810, -0.8222,\n",
       "         -0.9881, -0.9682,  0.4597, -1.0000, -0.9997,  0.9258, -1.0000, -1.0000,\n",
       "         -0.6581,  1.0000, -0.9976, -1.0000, -0.8982,  0.9489, -0.9080,  0.9993,\n",
       "         -1.0000,  0.9999,  1.0000,  0.9088,  0.9998, -1.0000,  0.9745, -0.9999,\n",
       "          1.0000, -0.9999, -0.9999,  0.9022,  1.0000,  1.0000,  0.9859,  0.9994,\n",
       "          1.0000,  0.9899,  0.9669,  0.9610, -0.9999,  0.9868, -1.0000,  0.3895,\n",
       "          1.0000,  0.9917, -0.9991,  0.9879, -0.9999, -1.0000, -0.9998,  1.0000,\n",
       "         -0.9313,  1.0000,  1.0000, -0.9998, -1.0000,  0.9967, -0.9996, -0.9954,\n",
       "         -0.9987,  0.9998,  0.3839, -0.9951,  0.5363, -0.0769, -0.6780, -0.9602,\n",
       "          0.9937,  0.9996,  0.9477, -0.9996,  0.9999, -0.9088, -1.0000, -0.9984,\n",
       "         -0.9999, -0.9949, -0.9994,  1.0000, -0.5663, -0.9630,  0.9999, -0.9999,\n",
       "          0.9980, -1.0000, -0.9767, -0.9776,  0.9995,  1.0000,  0.9999, -0.9992,\n",
       "          0.7933,  1.0000,  0.9947,  0.9999, -1.0000,  0.9998,  0.9886, -0.9998,\n",
       "         -0.6499, -0.9700,  1.0000,  0.9997,  0.9998, -0.9993,  0.9999, -1.0000,\n",
       "          1.0000, -1.0000,  1.0000, -1.0000, -0.9996,  1.0000,  0.5835,  1.0000,\n",
       "          0.4881,  1.0000, -0.9987, -1.0000,  0.2071,  0.9841,  0.9772, -1.0000,\n",
       "          0.9966, -0.9978, -0.0712, -0.8875, -1.0000,  1.0000, -0.9943,  1.0000,\n",
       "          0.9936, -0.9993, -0.9932, -0.9999, -0.7205, -0.9999, -0.9955,  0.9945,\n",
       "         -0.6264,  0.9999, -0.9988, -0.9974,  0.9961, -0.9993, -1.0000,  0.9997,\n",
       "         -0.9633,  0.9966,  0.9968, -0.8558,  0.1031, -0.9476, -0.9900,  1.0000,\n",
       "          0.9906,  0.9335,  0.9998,  0.5868, -0.9853, -0.9261, -1.0000, -0.9779,\n",
       "          1.0000, -0.9802, -1.0000,  0.9919, -1.0000,  0.5570, -0.9243, -0.9926,\n",
       "         -0.9998, -0.9999,  0.9982, -0.3304, -0.9999,  0.9972,  0.7547, -0.7263,\n",
       "         -1.0000,  0.9684,  0.9999,  0.9794,  0.9992, -0.9990, -1.0000,  0.9999,\n",
       "         -0.9994, -0.9656,  0.9782,  1.0000,  0.9999,  0.8883,  0.9906,  1.0000,\n",
       "          0.8663, -1.0000,  0.9902, -1.0000, -0.9686,  1.0000, -0.9999,  0.9714,\n",
       "          1.0000,  0.9804,  1.0000, -0.9932, -1.0000, -0.9999,  1.0000,  0.9992,\n",
       "          1.0000, -0.9994, -1.0000, -0.7841, -0.9982, -1.0000, -1.0000,  0.5399,\n",
       "          0.9999,  1.0000,  0.9529, -0.9999, -0.9983, -0.9997,  1.0000, -0.9995,\n",
       "          1.0000,  0.9985, -0.9990, -0.9984,  0.4102, -0.9887, -0.9999,  0.9476,\n",
       "         -1.0000, -0.9998, -1.0000,  0.5216, -0.9999, -1.0000,  0.9927,  1.0000,\n",
       "          0.9832, -1.0000,  1.0000,  1.0000,  0.6493, -0.9897,  0.9987, -1.0000,\n",
       "          1.0000, -0.9998,  0.9992, -0.9910, -0.9988,  0.6841,  1.0000,  0.9991,\n",
       "         -0.0945, -0.8882, -0.9999, -0.9984,  0.6373,  0.9962, -0.9928,  0.9837,\n",
       "         -0.9835, -0.5475, -0.6533, -0.9646, -1.0000,  0.9946,  1.0000, -0.9937,\n",
       "          1.0000,  0.9995,  1.0000,  0.9988, -0.9979,  0.9999, -0.9568, -0.9371,\n",
       "         -0.9975, -0.9796,  0.9989,  0.9934, -0.9996, -1.0000,  1.0000, -0.4073,\n",
       "          0.0726,  0.9991, -0.9819,  0.7489,  0.9996, -0.9997,  0.9989, -0.9999,\n",
       "         -0.9999,  0.9999,  1.0000,  0.9999,  0.7050, -0.9942,  0.9992, -1.0000,\n",
       "          0.9998, -1.0000,  0.9999,  0.7262,  0.9978, -0.9997, -0.9997,  1.0000,\n",
       "          0.9191, -0.7063,  0.9999, -0.9997,  0.9823,  0.9794,  0.9979,  0.9994,\n",
       "          0.9998,  1.0000, -0.4151, -0.4769, -0.9945, -0.9979, -0.9999, -1.0000,\n",
       "          0.9442, -1.0000, -0.9992, -0.5763, -0.9380,  0.9991, -0.9614,  0.9741,\n",
       "         -0.9200,  0.7585, -0.6832,  0.7789,  0.9100, -0.9990, -0.9997, -1.0000,\n",
       "         -0.9996,  0.9937,  1.0000, -1.0000,  1.0000, -1.0000, -0.9945,  0.9909,\n",
       "         -0.9975, -0.9766,  0.9982, -1.0000,  0.9968,  1.0000,  1.0000,  0.9997,\n",
       "          1.0000, -0.0377, -0.9999, -0.9999, -1.0000, -1.0000, -1.0000,  0.9967,\n",
       "          0.5768, -1.0000, -0.9999,  0.9974,  1.0000,  0.9999, -1.0000, -0.9960,\n",
       "         -1.0000, -1.0000,  0.9998, -1.0000, -1.0000,  0.8403,  0.2925,  1.0000,\n",
       "         -0.7300,  0.9968,  0.9721, -0.8463,  0.9994, -1.0000,  0.9960,  1.0000,\n",
       "          0.9902, -1.0000, -0.8275, -0.3285, -1.0000, -0.5722,  0.9921,  1.0000,\n",
       "         -1.0000, -0.9919, -0.9993,  0.9939,  0.9998,  1.0000,  0.9999,  0.9973,\n",
       "          0.9966,  0.9990, -0.2278,  1.0000,  0.9019, -0.9999,  1.0000, -0.9931,\n",
       "          0.3810, -0.9970,  1.0000,  0.9909,  1.0000,  0.9994,  0.0773, -0.8879,\n",
       "         -1.0000,  0.9805,  1.0000, -0.9960, -0.9988, -1.0000, -0.9999, -0.9999,\n",
       "         -0.9837,  0.9481, -0.9999, -0.9999, -0.2732,  0.8276,  1.0000,  1.0000,\n",
       "          0.9999, -0.9998, -0.9134,  0.9975, -0.9959,  0.9502, -0.9299, -1.0000,\n",
       "         -0.9998, -0.9908,  1.0000, -0.9984,  0.8839, -0.9043,  0.9909,  0.9980,\n",
       "         -1.0000, -0.9808, -0.9997,  0.9978,  1.0000, -1.0000,  0.9995, -0.9992,\n",
       "          0.9993,  0.9830,  0.9992,  0.9999, -0.9392, -0.6955, -0.8634, -0.6895,\n",
       "          0.9410,  0.9981, -1.0000, -0.6234,  1.0000, -0.9660,  0.9999,  0.5241,\n",
       "          0.2568,  0.9977,  1.0000,  0.9999,  1.0000,  0.9980,  0.9982,  1.0000,\n",
       "          0.5588,  0.9976, -0.4912, -0.9997,  0.9614, -0.1142,  1.0000, -0.9842,\n",
       "         -0.9951, -1.0000,  0.8644,  1.0000,  1.0000, -0.9995,  0.9998,  0.8025,\n",
       "          0.6844,  0.9762,  0.9916,  0.9893,  0.3525,  0.9999,  1.0000, -1.0000,\n",
       "         -0.9999, -1.0000,  1.0000,  0.9998, -0.9740, -1.0000,  0.9999, -0.9981,\n",
       "          0.3949,  0.9960,  0.9281, -0.9850,  0.8734, -1.0000, -0.1166,  0.9119,\n",
       "          0.9983, -0.9729,  0.9999, -0.9999,  0.9485,  1.0000, -0.9886,  1.0000,\n",
       "          0.3598, -1.0000,  1.0000, -1.0000, -0.9999, -0.1344,  1.0000,  0.9999,\n",
       "          0.9721, -0.9948,  1.0000, -1.0000,  1.0000, -1.0000, -0.9784, -0.9999,\n",
       "          1.0000, -0.9999, -0.9995, -0.9961,  0.9934, -0.6841, -0.9959,  1.0000,\n",
       "          0.9830, -0.0785,  0.0016, -0.9982, -0.9997, -0.9993, -0.9789, -1.0000,\n",
       "          0.9880,  0.6295, -0.9854, -0.9989, -1.0000,  1.0000,  0.9102, -0.9993,\n",
       "          1.0000,  0.6416, -1.0000,  0.9998, -1.0000,  0.9974,  0.9995,  0.9282,\n",
       "          0.9281, -1.0000,  0.9451,  1.0000, -0.9977, -0.1010, -0.8494, -0.9989,\n",
       "          0.9680,  0.9994,  0.9994, -0.9982,  0.9991,  0.9782,  0.9994, -0.9993,\n",
       "          0.5694, -1.0000, -0.9947, -0.9771, -0.5015, -1.0000, -1.0000,  1.0000,\n",
       "          1.0000,  1.0000, -0.9997, -0.9630,  0.9945,  0.9997, -0.9997, -0.5486,\n",
       "         -0.4082,  0.9995,  0.9815, -0.9995, -0.9222, -1.0000, -0.9999,  0.8829,\n",
       "          0.9606,  0.9846,  1.0000,  1.0000, -0.9993, -0.9850, -1.0000, -1.0000,\n",
       "          1.0000,  0.9998,  1.0000, -0.9935, -0.9935,  1.0000, -0.9598, -0.9793,\n",
       "         -0.9996, -1.0000, -1.0000,  0.9801, -0.9996, -1.0000,  0.9997,  1.0000,\n",
       "          0.2486, -1.0000, -0.9970,  1.0000,  1.0000,  1.0000,  0.9682,  1.0000,\n",
       "         -0.9981,  0.9991, -0.9999,  1.0000, -1.0000,  1.0000,  1.0000,  0.9988,\n",
       "          0.9996, -0.9998,  0.9529, -1.0000,  0.9445,  0.9934, -0.9129, -0.9996,\n",
       "          0.7888, -0.7471, -0.9998,  1.0000,  0.9782, -0.9456,  0.9992,  0.8537,\n",
       "          1.0000, -0.7332, -1.0000,  0.8291,  0.9964,  0.9996,  1.0000,  0.9961,\n",
       "          1.0000, -0.9619, -0.9998,  0.9999, -0.9962, -0.9640, -1.0000,  1.0000,\n",
       "          0.9997, -1.0000, -0.9990, -0.0881,  0.9771,  1.0000,  0.9998,  0.9856,\n",
       "          0.9443,  0.7739,  0.9998, -1.0000,  0.9999, -0.9997, -0.9957,  1.0000,\n",
       "         -0.9999,  0.9999, -0.9997,  0.9967, -1.0000,  0.3715,  0.9992,  0.9983,\n",
       "         -0.9992,  1.0000,  0.9850, -0.9977, -0.9998, -0.9996, -0.9993,  0.9992]],\n",
       "       grad_fn=<TanhBackward>), hidden_states=None, past_key_values=None, attentions=None, cross_attentions=None)"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "outputs"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "id": "599a60d2",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "torch.Size([1, 7, 768])"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "outputs[0].shape"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7287208d",
   "metadata": {},
   "source": [
    "last_hidden_state 的 shape (1, 7, 768), 表示：1句话，7个token，分别是1个CLS + 5个汉字 + 1个SEP， 768是embedding size。\n",
    "\n",
    "- 计算句子间相似度值"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "id": "cae5d99c",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[1.   0.78 0.79 0.6 ]\n",
      " [0.78 1.   0.75 0.58]\n",
      " [0.79 0.75 1.   0.61]\n",
      " [0.6  0.58 0.61 1.  ]]\n"
     ]
    }
   ],
   "source": [
    "def sentence_embedding(sentence):\n",
    "    input_ids = tokenizer(sentence, return_tensors='pt')\n",
    "    o = model(**input_ids)\n",
    "    return torch.mean(o[0], dim=1)\n",
    "\n",
    "\n",
    "sentences = ['春眠不觉晓', '大梦谁先觉', '浓睡不消残酒', '东临碣石以观沧海']\n",
    "\n",
    "with torch.no_grad():\n",
    "    vs = [sentence_embedding(sentence).numpy() for sentence in sentences]\n",
    "    nvs = [v / np.linalg.norm(v) for v in vs]  # normalize each vector\n",
    "    m = np.array(nvs).squeeze(1)  # shape (4, 768)\n",
    "    print(np.around(m @ m.T, decimals=2))  # pairwise cosine similarity"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "bdb58ff7",
   "metadata": {},
   "source": [
    "# 获取SentenceBert的句子向量表示"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "id": "1736556d",
   "metadata": {
    "id": "GQwgCgsiPOAA"
   },
   "outputs": [],
   "source": [
    "a = \"purple is the best city in the forest\"\n",
    "b = \"there is an art to getting your way and throwing bananas on to the street is not it\"  # this is very similar to 'g'\n",
    "c = \"it is not often you find soggy bananas on the street\"\n",
    "d = \"green should have smelled more tranquil but somehow it just tasted rotten\"\n",
    "e = \"joyce enjoyed eating pancakes with ketchup\"\n",
    "f = \"as the asteroid hurtled toward earth becky was upset her dentist appointment had been canceled\"\n",
    "g = \"to get your way you must not bombard the road with yellow fruit\"  # this is very similar to 'b'"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cb7f719b",
   "metadata": {
    "id": "1IJjhD9FPOAB"
   },
   "source": [
    "Installing dependencies needed for this notebook"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "id": "006016b8",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "wbyQh8-sPOAC",
    "outputId": "96b06817-cbd7-48b6-d43d-507333397cc9"
   },
   "outputs": [],
   "source": [
    "!pip install -qU transformers sentence-transformers"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "id": "fb3b9249",
   "metadata": {
    "id": "Cwf6FNb6POAC"
   },
   "outputs": [],
   "source": [
    "from transformers import AutoTokenizer, AutoModel\n",
    "import torch\n",
    "import os\n",
    "os.environ[\"KMP_DUPLICATE_LIB_OK\"]=\"TRUE\""
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7ad71458",
   "metadata": {
    "id": "siMAiB9wPOAC"
   },
   "source": [
    "Initialize our HF transformer model and tokenizer - using a pretrained SBERT model."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "id": "0714a0ab",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 360,
     "referenced_widgets": [
      "bd747e6fd09d4ab5ad05731db302f31f",
      "bcc0bb9cf46a41bb89e3692775d22aad",
      "e2e93db19cf2415ea191f87b9f62633b",
      "81a382c44920421f855e701f84b3e16b",
      "3f8fd0ed5b6d4fe7827eab67457f0385",
      "02b81a106fe4474a94ac0433449b0e08",
      "6ead6147475543bfa8bc06f768e25cd7",
      "daa953d1e6114f908aaf813618966790",
      "c942cbafa553413f9590237f9a2bfb4c",
      "a5eeb82f983e4775bcd409d3d3ec37eb",
      "5d82ecc48f1941de972f03d299d06188",
      "c2db0d8a0cae4ff496628a01ec3fba13",
      "c9adbffc87c54e67b592e523b04a31eb",
      "cacf9b3091bc4056b30f42bec108f504",
      "f0bf207292c648bd87ade0368453678a",
      "cc3658915b4a4db58ba97ed594bc6642",
      "23404af5c1e44a20bb6a8f3aee75853b",
      "85bc7288c26149f89f4be2dd09b8fe54",
      "13f728c7fa9c485682b601ac16405b74",
      "0f49806b2736486395fef13fed60274b",
      "6efba81172a74300aa6080339f3060ab",
      "96045549ce1e4322aed7d1eb5cd7c79d",
      "0c01553ba4854dc4b78f54061223eff0",
      "4043b1f3873c411ca5b7eade7188d1d4",
      "781f3e8d83e7442394923726393a93a4",
      "08e178f193ea432aa623424f411a9569",
      "fcf25ec3e7bf411e97b8686225c1d883",
      "ed2c73904f224fdbb42e2e2fa025b48e",
      "7e88a63dfbc74edf91a1e4bfdb98d1d4",
      "44b3062bdd5e489eb2684b1adf6fb89d",
      "f93624decfcd47e2bfb61753df0f172d",
      "2a62e3a3fd5e4fa0a3c36eb8c65675f1",
      "6df6814f1740433f94696566f1811584",
      "97f18520f44b46a59aed8c39ebc20d7a",
      "c45135a823ea4e88826defc0948c928c",
      "e0025c97eb16421ab26a1e2dfaee31c3",
      "942e525e0243464e99700fd72ebc8cc2",
      "b18ea83daef248c5a68e29c91709b6a5",
      "f9a29c4870544fc191959d3f9782d663",
      "eb600693698e4a54a42ac565cd203a1f",
      "831d379435644a909195bae28691c497",
      "7453e2654a9f423a9ff99e69948d2060",
      "b013b765aa404098aef52b81c6119f52",
      "220e3448e57543a59732f99820be37a3",
      "41226109ca2d43469682942d23f59a13",
      "d3aae59c74b9468fbf7f798bb0ca0c68",
      "d228e28dc39541689d2a98e0ef33a527",
      "f02430b18a714c8eaa7c1e7a18770ab0",
      "eadfc30b5d0444079f97b896216b1b9d",
      "fe6728395e884aa2981ceac304b9f0ca",
      "d84cdd7ef9a44850aeff816d07b6aa00",
      "fbca22f16ddf45f3a4f55e2fe69cd6e1",
      "fba649c719a04d9dbd77ba58fcb2f8c9",
      "87ad8bea90134fecaa30e8ce9c93040f",
      "d676b93f5b1646d99e0c69bea91e609b",
      "bfc4d8e8ec384c2bad04c6bbf8d1ae1f"
     ]
    },
    "id": "2yX0eB8qPOAD",
    "outputId": "bd2d0158-df09-4fd9-c3e7-8ebdc2a01298"
   },
   "outputs": [],
   "source": [
    "tokenizer = AutoTokenizer.from_pretrained('sentence-transformers/bert-base-nli-mean-tokens')\n",
    "model = AutoModel.from_pretrained('sentence-transformers/bert-base-nli-mean-tokens')"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1158cef7",
   "metadata": {
    "id": "9dZz3oYbPOAE"
   },
   "source": [
    "Tokenize all of our sentences."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "id": "09b0f2c7",
   "metadata": {
    "id": "tis3AlkFPOAF"
   },
   "outputs": [],
   "source": [
    "tokens = tokenizer([a, b, c, d, e, f, g],\n",
    "                   max_length=128,\n",
    "                   truncation=True,\n",
    "                   padding='max_length',\n",
    "                   return_tensors='pt')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "id": "4221df31",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "ojSyj3PNPOAF",
    "outputId": "e21850eb-00c5-460f-ab6b-426ff8da6465"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "dict_keys(['input_ids', 'token_type_ids', 'attention_mask'])"
      ]
     },
     "execution_count": 33,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tokens.keys()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "id": "98c7df8f",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "eJdDObOqPOAG",
    "outputId": "21134906-7fcc-45af-b514-87605fad1fe7"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor([ 101, 6379, 2003, 1996, 2190, 2103, 1999, 1996, 3224,  102,    0,    0,\n",
       "           0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n",
       "           0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n",
       "           0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n",
       "           0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n",
       "           0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n",
       "           0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n",
       "           0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n",
       "           0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n",
       "           0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n",
       "           0,    0,    0,    0,    0,    0,    0,    0])"
      ]
     },
     "execution_count": 34,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tokens['input_ids'][0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "id": "b292087c",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "torch.Size([128])"
      ]
     },
     "execution_count": 35,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tokens['input_ids'][0].shape"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "35ffefa4",
   "metadata": {
    "id": "HOSxI6tdPOAH"
   },
   "source": [
    "Process our tokenized tensors through the model."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "id": "3dadc0c7",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "hnG-sptwPOAH",
    "outputId": "f32db3a1-f855-4445-823f-79e5b4125660"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "odict_keys(['last_hidden_state', 'pooler_output'])"
      ]
     },
     "execution_count": 36,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "outputs = model(**tokens)\n",
    "outputs.keys()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ad582792",
   "metadata": {
    "id": "3MLU61HmPOAH"
   },
   "source": [
    "Here we can see the final embedding layer, *last_hidden_state*."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "id": "7f343deb",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "4zEdj68xPOAI",
    "outputId": "fe5b7986-f208-43ab-86ed-aea0bcba67fe"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor([[-0.6239, -0.2058,  0.0411,  ...,  0.1490,  0.5681,  0.2381],\n",
       "        [-0.3694, -0.1485,  0.3780,  ...,  0.4204,  0.5553,  0.1441],\n",
       "        [-0.7221, -0.3813,  0.2031,  ...,  0.0761,  0.5162,  0.2813],\n",
       "        ...,\n",
       "        [-0.1894, -0.3711,  0.3034,  ...,  0.1536,  0.3265,  0.1376],\n",
       "        [-0.2496, -0.5227,  0.2341,  ...,  0.3419,  0.3164,  0.0256],\n",
       "        [-0.3311, -0.4430,  0.3492,  ...,  0.3655,  0.2910,  0.0728]],\n",
       "       grad_fn=<SelectBackward>)"
      ]
     },
     "execution_count": 37,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "embeddings = outputs.last_hidden_state\n",
    "embeddings[0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "id": "cbbe8ae5",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "RPRY4pl0POAI",
    "outputId": "2af7538d-aa60-4f1c-9259-e5f4a1a2ecbb"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "torch.Size([128, 768])"
      ]
     },
     "execution_count": 38,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "embeddings[0].shape"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f6b7772b",
   "metadata": {
    "id": "W8bUbDPqPOAI"
   },
   "source": [
    "Here we have our vectors of length *768*, but we see that these are not *sentence vectors* because we have a vector representation for each token in our sequence (128 in total). We need to perform a mean pooling operation to create the sentence vector.\n",
    "\n",
    "The first thing we do is multiply each value in our `embeddings` tensor by its respective `attention_mask` value. The `attention_mask` contains **1s** where we have 'real tokens' (eg not padding tokens), and 0s elsewhere - so this operation allows us to ignore non-real tokens."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "id": "5bcf1bf5",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "tBL_tpCKPOAI",
    "outputId": "6ecfd27f-9a00-423e-ef8d-ecf52619672d"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "torch.Size([7, 128, 768])"
      ]
     },
     "execution_count": 39,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "mask = tokens['attention_mask'].unsqueeze(-1).expand(embeddings.size()).float()\n",
    "mask.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "id": "09b07126",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "gKG0MKM8POAJ",
    "outputId": "43a9876c-2d6c-484d-f38b-953ac835760b"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor([[1., 1., 1.,  ..., 1., 1., 1.],\n",
       "        [1., 1., 1.,  ..., 1., 1., 1.],\n",
       "        [1., 1., 1.,  ..., 1., 1., 1.],\n",
       "        ...,\n",
       "        [0., 0., 0.,  ..., 0., 0., 0.],\n",
       "        [0., 0., 0.,  ..., 0., 0., 0.],\n",
       "        [0., 0., 0.,  ..., 0., 0., 0.]])"
      ]
     },
     "execution_count": 40,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "mask[0]"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "076b5945",
   "metadata": {
    "id": "eCbbJtQbPOAJ"
   },
   "source": [
    "Now we have a masking array that has an equal shape to our output `embeddings` - we multiply those together to apply the masking operation on our outputs."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "id": "a95abb08",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "emkKlta2POAJ",
    "outputId": "68194d0f-0917-489c-f02f-52102c8b2e3c"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor([[-0.6239, -0.2058,  0.0411,  ...,  0.1490,  0.5681,  0.2381],\n",
       "        [-0.3694, -0.1485,  0.3780,  ...,  0.4204,  0.5553,  0.1441],\n",
       "        [-0.7221, -0.3813,  0.2031,  ...,  0.0761,  0.5162,  0.2813],\n",
       "        ...,\n",
       "        [-0.0000, -0.0000,  0.0000,  ...,  0.0000,  0.0000,  0.0000],\n",
       "        [-0.0000, -0.0000,  0.0000,  ...,  0.0000,  0.0000,  0.0000],\n",
       "        [-0.0000, -0.0000,  0.0000,  ...,  0.0000,  0.0000,  0.0000]],\n",
       "       grad_fn=<SelectBackward>)"
      ]
     },
     "execution_count": 41,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "masked_embeddings = embeddings * mask\n",
    "masked_embeddings[0]"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "37904a82",
   "metadata": {
    "id": "cSQvVeh7POAJ"
   },
   "source": [
    "Sum the remaining embeddings along axis 1 to get a total value in each of our 768 values."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "id": "daf81271",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "CbQpjUH3POAJ",
    "outputId": "54f143ec-19ac-43d5-b540-1bc54e4c297d"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "torch.Size([7, 768])"
      ]
     },
     "execution_count": 42,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "summed = torch.sum(masked_embeddings, 1)\n",
    "summed.shape"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f9652917",
   "metadata": {
    "id": "VVTv5-CjPOAK"
   },
   "source": [
    "Next, we count the number of values that should be given attention in each position of the tensor (+1 for real tokens, +0 for non-real)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "id": "1c160f44",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "PTS2cuqqPOAK",
    "outputId": "2f7be2fc-6c3a-4d9b-c395-127b0012f048"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "torch.Size([7, 768])"
      ]
     },
     "execution_count": 43,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "counted = torch.clamp(mask.sum(1), min=1e-9)\n",
    "counted.shape"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f0e716a6",
   "metadata": {
    "id": "kOYEPr8cPOAK"
   },
   "source": [
    "Finally, we get our mean-pooled values as the `summed` embeddings divided by the number of values that should be given attention, `counted`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "id": "9f61eeff",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "S-YdhdY1POAK",
    "outputId": "d4a56c03-a15c-418d-f756-f7b1020a2a94"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "torch.Size([7, 768])"
      ]
     },
     "execution_count": 44,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "mean_pooled = summed / counted\n",
    "mean_pooled.shape"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "bc7d72c4",
   "metadata": {
    "id": "hhDzQLNPPOAK"
   },
   "source": [
    "Now we have our sentence vectors, we can calculate the cosine similarity between each."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "id": "5cf731fd",
   "metadata": {
    "id": "Oox_rs33POAL"
   },
   "outputs": [],
   "source": [
    "from sklearn.metrics.pairwise import cosine_similarity\n",
    "import numpy as np"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "id": "f8dad802",
   "metadata": {
    "id": "iSGNPpiAPOAL"
   },
   "outputs": [],
   "source": [
    "# convert to numpy array from torch tensor\n",
    "mean_pooled = mean_pooled.detach().numpy()\n",
    "\n",
    "# calculate similarities (will store in array)\n",
    "scores = np.zeros((mean_pooled.shape[0], mean_pooled.shape[0]))\n",
    "for i in range(mean_pooled.shape[0]):\n",
    "    scores[i, :] = cosine_similarity(\n",
    "        [mean_pooled[i]],\n",
    "        mean_pooled\n",
    "    )[0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "id": "2370934f",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "Ahxwj8v3POAL",
    "outputId": "98d79bc9-5fc3-442e-94e7-4bef13d12c7b"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 1.00000024,  0.18692753,  0.28297687,  0.29628235,  0.27451012,\n",
       "         0.1017626 ,  0.21696253],\n",
       "       [ 0.18692753,  1.        ,  0.72058773,  0.5142895 ,  0.11749641,\n",
       "         0.1930692 ,  0.66182351],\n",
       "       [ 0.28297687,  0.72058773,  1.00000012,  0.48864433,  0.2356894 ,\n",
       "         0.17157128,  0.5599308 ],\n",
       "       [ 0.29628235,  0.5142895 ,  0.48864433,  0.99999976,  0.26985487,\n",
       "         0.3788943 ,  0.52388817],\n",
       "       [ 0.27451012,  0.11749642,  0.23568939,  0.2698549 ,  0.99999994,\n",
       "         0.23422128, -0.01599788],\n",
       "       [ 0.10176259,  0.1930692 ,  0.17157127,  0.37889427,  0.23422126,\n",
       "         1.00000012,  0.22319673],\n",
       "       [ 0.21696255,  0.66182345,  0.5599308 ,  0.52388811, -0.01599788,\n",
       "         0.22319674,  0.99999994]])"
      ]
     },
     "execution_count": 47,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "scores"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "655f26d3",
   "metadata": {
    "id": "8fJlbuiFPOAL"
   },
   "source": [
    "We can visualize these scores using `matplotlib`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "id": "96eb5ba7",
   "metadata": {
    "id": "yx8PK6osPOAL"
   },
   "outputs": [],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "import seaborn as sns"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "id": "909db1f8",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 558
    },
    "id": "1qhhruwOPOAM",
    "outputId": "03beae98-d7a9-4e8b-990d-c39fec9c0716"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<AxesSubplot:>"
      ]
     },
     "execution_count": 49,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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zB8QW6tWBCt+n0fVqpXxeDw8/O97ad2mO4cPH+GRYc8z9ZP/EhISzJ49+xlc4Nh2Ys8RdmdmznYsw9ka1vCWsvrendHPx6LPXKgMa1OuVqBDCKiqBAc6hIAavzqgydaAG9LxiUCHEDDTYuzzocdXXNkH/TonZnz92336t/bx/dMDMsfHts9JERERkVyBnCbsS3osvoiIiJRKyqSIiIjYnL5gUERERMSPlEkRERGxubI6Q0WZFBERESmVlEkRERGxOU8ZzaUokyIiIiKlkjIpIiIiNqfZPSIiIiJ+pEyKiIiIzZXNESnKpIiIiEgppUyKiIiIzWlMioiIiIgfKZMiIiJic2X1W5DVSREREbE5PcxNRERExI+USREREbG5splHUSZFRERESillUkRERGxOU5BFRERE/EiZFBEREZvT7B4RERERP1ImRURExObKZh5FmRQREREppZRJERERsTnN7hERERHxI2VSREREbE6ze0RERET8SJkUERERmyubeRQ/dFIWHd3r6/+i1GpcrkagQwioGHdmoEMIqG5WeKBDCKghHZ8IdAgBNWX1a4EOIWByOjwe6BCkjFAmRURExOY0u0dERETEj5RJERERsTmrjI5KUSZFRERESiVlUkRERGxOY1JERERE/EiZFBEREZsrq0+cVSdFRETE5spmF0W3e0RERKSUUiZFRETE5srq7R5lUkRERKRUUiZFRETE5jQFWURERMSPlEkRERGxOT0WX0RERMSPlEkRERGxOY1JEREREfEjZVJERERsTmNSRERERPxImRQRERGb05gUERERET9SJkVERMTmPJbGpIiIiIj4jTIpIiIiNlc28yjKpIiIiEgppUyKiIiIzXnKaC5FmRQREREplZRJERERsbmy+sRZdVJERERsTg9zExEREfGjMpNJ6XpVZ54ePQyn08GXM2bzwX+neW1v1KQBL705nJatm/PW2El8PPHTAEVaMtpd2Z57Rw7B4XSw6LOFfPnuF17b6zSuy8Pj/4/GrRoz/bWpfDPl6/xtf7u7L9fe2gtjYOHMBcz5YLa/wy+2jt07MHTkUJxOB/Nmzufzd//ntb1e47o8+vqjNGnVhE9e+4QvJn8JQN0L6vDsu8/kl4usH8W016fx9Qff+DP8YqvT/WI6vzgIh9PBtplL2PDOHK/t9a9tT4cn/oHlsfC43KwYOZ34VdsB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\n",
      "text/plain": [
       "<Figure size 720x648 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(10,9))\n",
    "labels = ['a', 'b', 'c', 'd', 'e', 'f', 'g']\n",
    "sns.heatmap(scores, xticklabels=labels, yticklabels=labels, annot=True)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b7f51ef4",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "---"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a82f121c",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "Use transformer Hub usage:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "id": "ae110ee3",
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Asking to truncate to max_length but no maximum length is provided and the model has no predefined maximum length. Default to no truncation.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Sentence embeddings:\n",
      "tensor([[-0.6474, -0.2272,  0.2818,  ...,  0.1978,  0.4435,  0.0792],\n",
      "        [ 0.6863, -0.0601, -0.2189,  ...,  0.7335, -0.5784,  0.1052],\n",
      "        [ 0.3188, -0.5652, -0.1400,  ...,  1.3114, -0.2103, -0.6065],\n",
      "        ...,\n",
      "        [-0.8977,  0.5363, -0.4212,  ...,  0.1217,  0.6893, -0.0699],\n",
      "        [-0.2906,  0.6061,  0.7286,  ..., -0.2979,  0.0418,  0.0344],\n",
      "        [ 0.4173,  0.5862,  0.6657,  ...,  0.4557, -1.4096, -0.0327]])\n"
     ]
    }
   ],
   "source": [
    "from transformers import AutoTokenizer, AutoModel\n",
    "import torch\n",
    "\n",
    "\n",
    "#Mean Pooling - Take attention mask into account for correct averaging\n",
    "def mean_pooling(model_output, attention_mask):\n",
    "    token_embeddings = model_output[0] #First element of model_output contains all token embeddings\n",
    "    input_mask_expanded = attention_mask.unsqueeze(-1).expand(token_embeddings.size()).float()\n",
    "    return torch.sum(token_embeddings * input_mask_expanded, 1) / torch.clamp(input_mask_expanded.sum(1), min=1e-9)\n",
    "\n",
    "\n",
    "# Sentences we want sentence embeddings for\n",
    "sentences = [a, b, c, d, e, f, g]\n",
    "# Load model from HuggingFace Hub\n",
    "# tokenizer = AutoTokenizer.from_pretrained('sentence-transformers/bert-large-nli-stsb-mean-tokens')\n",
    "# model = AutoModel.from_pretrained('sentence-transformers/bert-large-nli-stsb-mean-tokens')\n",
    "\n",
    "\n",
    "tokenizer = AutoTokenizer.from_pretrained('sentence-transformers/bert-base-nli-mean-tokens')\n",
    "model = AutoModel.from_pretrained('sentence-transformers/bert-base-nli-mean-tokens')\n",
    "\n",
    "# Tokenize sentences\n",
    "encoded_input = tokenizer(sentences, padding=True, truncation=True, return_tensors='pt')\n",
    "\n",
    "# Compute token embeddings\n",
    "with torch.no_grad():\n",
    "    model_output = model(**encoded_input)\n",
    "\n",
    "# Perform pooling. In this case, max pooling.\n",
    "sentence_embeddings = mean_pooling(model_output, encoded_input['attention_mask'])\n",
    "\n",
    "print(\"Sentence embeddings:\")\n",
    "print(sentence_embeddings)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "id": "1f00a7d9",
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[0., 0., 0., 0., 0., 0., 0.],\n",
       "       [0., 0., 0., 0., 0., 0., 0.],\n",
       "       [0., 0., 0., 0., 0., 0., 0.],\n",
       "       [0., 0., 0., 0., 0., 0., 0.],\n",
       "       [0., 0., 0., 0., 0., 0., 0.],\n",
       "       [0., 0., 0., 0., 0., 0., 0.],\n",
       "       [0., 0., 0., 0., 0., 0., 0.]])"
      ]
     },
     "execution_count": 51,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.metrics.pairwise import cosine_similarity\n",
    "import numpy as np\n",
    "\n",
    "# calculate similarities (will store in array)\n",
    "scores = np.zeros((sentence_embeddings.shape[0], sentence_embeddings.shape[0]))\n",
    "scores"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "id": "da2a6888",
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor([[-0.6474, -0.2272,  0.2818,  ...,  0.1978,  0.4435,  0.0792],\n",
       "        [ 0.6863, -0.0601, -0.2189,  ...,  0.7335, -0.5784,  0.1052],\n",
       "        [ 0.3188, -0.5652, -0.1400,  ...,  1.3114, -0.2103, -0.6065],\n",
       "        ...,\n",
       "        [-0.8977,  0.5363, -0.4212,  ...,  0.1217,  0.6893, -0.0699],\n",
       "        [-0.2906,  0.6061,  0.7286,  ..., -0.2979,  0.0418,  0.0344],\n",
       "        [ 0.4173,  0.5862,  0.6657,  ...,  0.4557, -1.4096, -0.0327]])"
      ]
     },
     "execution_count": 52,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sentence_embeddings"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "id": "f5778219",
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "sentence_embeddings = sentence_embeddings.numpy()\n",
    "for i in range(sentence_embeddings.shape[0]):\n",
    "    scores[i, :] = cosine_similarity(\n",
    "        [sentence_embeddings[i]],\n",
    "        sentence_embeddings\n",
    "    )[0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "id": "68707a5e",
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 1.00000024,  0.18692753,  0.28297687,  0.29628235,  0.27451012,\n",
       "         0.1017626 ,  0.21696253],\n",
       "       [ 0.18692753,  1.        ,  0.72058773,  0.5142895 ,  0.11749641,\n",
       "         0.1930692 ,  0.66182351],\n",
       "       [ 0.28297687,  0.72058773,  1.00000012,  0.48864433,  0.2356894 ,\n",
       "         0.17157128,  0.5599308 ],\n",
       "       [ 0.29628235,  0.5142895 ,  0.48864433,  0.99999976,  0.26985487,\n",
       "         0.3788943 ,  0.52388817],\n",
       "       [ 0.27451012,  0.11749642,  0.23568939,  0.2698549 ,  0.99999994,\n",
       "         0.23422128, -0.01599788],\n",
       "       [ 0.10176259,  0.1930692 ,  0.17157127,  0.37889427,  0.23422126,\n",
       "         1.00000012,  0.22319673],\n",
       "       [ 0.21696255,  0.66182345,  0.5599308 ,  0.52388811, -0.01599788,\n",
       "         0.22319674,  0.99999994]])"
      ]
     },
     "execution_count": 54,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "scores"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "id": "23f45aea",
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<AxesSubplot:>"
      ]
     },
     "execution_count": 55,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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zB8QW6tWBCt+n0fVqpXxeDw8/O97ad2mO4cPH+GRYc8z9ZP/EhISzJ49+xlc4Nh2Ys8RdmdmznYsw9ka1vCWsvrendHPx6LPXKgMa1OuVqBDCKiqBAc6hIAavzqgydaAG9LxiUCHEDDTYuzzocdXXNkH/TonZnz92336t/bx/dMDMsfHts9JERERkVyBnCbsS3osvoiIiJRKyqSIiIjYnL5gUERERMSPlEkRERGxubI6Q0WZFBERESmVlEkRERGxOU8ZzaUokyIiIiKlkjIpIiIiNqfZPSIiIiJ+pEyKiIiIzZXNESnKpIiIiEgppUyKiIiIzWlMioiIiIgfKZMiIiJic2X1W5DVSREREbE5PcxNRERExI+USREREbG5splHUSZFRERESillUkRERGxOU5BFRERE/EiZFBEREZvT7B4RERERP1ImRURExObKZh5FmRQREREppZRJERERsTnN7hERERHxI2VSREREbE6ze0RERET8SJkUERERmyubeRQ/dFIWHd3r6/+i1GpcrkagQwioGHdmoEMIqG5WeKBDCKghHZ8IdAgBNWX1a4EOIWByOjwe6BCkjFAmRURExOY0u0dERETEj5RJERERsTmrjI5KUSZFRERESiVlUkRERGxOY1JERERE/EiZFBEREZsrq0+cVSdFRETE5spmF0W3e0RERKSUUiZFRETE5srq7R5lUkRERKRUUiZFRETE5jQFWURERMSPlEkRERGxOT0WX0RERMSPlEkRERGxOY1JEREREfEjZVJERERsTmNSRERERPxImRQRERGb05gUERERET9SJkVERMTmPJbGpIiIiIj4jTIpIiIiNlc28yjKpIiIiEgppUyKiIiIzXnKaC5FmRQREREplZRJERERsbmy+sRZdVJERERsTg9zExEREfGjMpNJ6XpVZ54ePQyn08GXM2bzwX+neW1v1KQBL705nJatm/PW2El8PPHTAEVaMtpd2Z57Rw7B4XSw6LOFfPnuF17b6zSuy8Pj/4/GrRoz/bWpfDPl6/xtf7u7L9fe2gtjYOHMBcz5YLa/wy+2jt07MHTkUJxOB/Nmzufzd//ntb1e47o8+vqjNGnVhE9e+4QvJn8JQN0L6vDsu8/kl4usH8W016fx9Qff+DP8YqvT/WI6vzgIh9PBtplL2PDOHK/t9a9tT4cn/oHlsfC43KwYOZ34VdsB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\n",
      "text/plain": [
       "<Figure size 720x648 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "import seaborn as sns\n",
    "\n",
    "plt.figure(figsize=(10,9))\n",
    "labels = ['a', 'b', 'c', 'd', 'e', 'f', 'g']\n",
    "sns.heatmap(scores, xticklabels=labels, yticklabels=labels, annot=True)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6baef424",
   "metadata": {
    "id": "bHqkpKuUPOAM"
   },
   "source": [
    "---\n",
    "\n",
    "## Using sentence-transformers\n",
    "\n",
    "The `sentence-transformers` library allows us to compress all of the above into just a few lines of code."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "id": "6ac8fc18",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 654,
     "referenced_widgets": [
      "92a5861843524121a8b71b0946f7396b",
      "304dfea2a6e843f6b96de31a85b8d318",
      "15fd69f9804c491b899b1ee67fea9495",
      "8c1978a828ee465aa9bdb38da5e50fa7",
      "c5f449becd5e478385c048d9a2d34209",
      "6cec1515378a4768888711f97eee9334",
      "d2926e00b69c42f78bec0fa748853d21",
      "19bf6d08b4ea46668d81cddb3e5c80e8",
      "7a48d1afdd9c45848d85283fd9eba4bb",
      "5234db47e25445438973f37351931096",
      "2c4d6230576941e29d70ec2c505ee460",
      "740b5a0742b04aa7bd853dd151c622d5",
      "cac974ca1d7546f383190d5649847f42",
      "e1f10885fe194449b8b8d9619b4efec0",
      "4bd783851d3e4f0dbc68f0d8a2d9e272",
      "d7ed790e572f467da40fb4c8793fad3a",
      "b0772b9e59c04edb8e9d558d8491d652",
      "e6403aba0a164cbe80c93cd5b5f7b5e8",
      "e0185eeb8bf94c52a22824bec73a9bb4",
      "7319300f75864106ba99b42a92489df0",
      "20186d4396e24e7786e089cec3131851",
      "d1fd21c386734cac8c274767b766d0d4",
      "a0343b9230a24cb69334e464b349f05c",
      "5bb8f87989624a3f819addcc73295594",
      "c563b32f4f934daf8a63b5131d4a0694",
      "ac3d7daf17a74b2da201213fc72fce9c",
      "5bd17b6c8efb4a14bdd227f0df19cd91",
      "c26f0d35e3ee46eb90b16ee8891e6c02",
      "f7ab7f09ccaa4ffb8f1a7ef0fc0960e1",
      "bc35383348a74a8ba8607c5a31b2abab",
      "06edd2a52acd40f1b17d074dce745058",
      "0aca7eeb7e364169b927197274558698",
      "42a0e12af9424a4ab8e198ba44a3f8ff",
      "b7a8da1285204307846b4ea6fbdcefa9",
      "22c8ec234de7447eabd7bd04b6cc4dfe",
      "c9ae493829b84593afa538d86cfca0b5",
      "8fee898e326b40e6a5e00559d3c2ed45",
      "33fd88fa79174c9bb8f6a0a8ed15e1cb",
      "605413597acf4dab9f7d64a4f11b9b4b",
      "73de0eaaa55f43e8b30e94536eb4c2ad",
      "72889f36c3bc40c7aaa442c6e4f4b336",
      "107901eea8104591b05aacece8891640",
      "4ded14e82b4541d8a642688c82063bc2",
      "295b32a974d84e88af1c5f13e7f79618",
      "28e08ba3a85c456d980bc26f50845c85",
      "921062d264d24467b3bf54f4ca2a1c5d",
      "030cfb8ed74c4dfd85f229c2336d7534",
      "5d1294ad01e64a0ea04c23bf01b8e71a",
      "bf4d9c7449a2428993b4044baeb525c5",
      "885ea83105d54fbd875854ed2b825020",
      "f9904673689a42dc8903fa3f0b1af0fc",
      "a2dc0cdd38734557bbd7867fbade1c31",
      "6bc4d8b567f4438ba4595ac1bc057ea0",
      "f495402781924262831a5b9f77fb1aef",
      "21d1b297b6ee4274bf91d35f32d12193",
      "c8e8a97cce994bf1b5480a3c9ffe53b5",
      "94f8374076d14d57a5acdaf210e4ad02",
      "6741f558f5814de89dd802e052ec1e4d",
      "220720223a8249fcaae7b00d17de4479",
      "18f41793c5f24534b6f89a11a039a7b8",
      "34ba82a557024e239aded58faffe0fae",
      "02034d7cc6c84b2189330782f73f6042",
      "f1958361116540898409cc156f8109d0",
      "f99a6132c04f4d949fa093f038a353d3",
      "4a1145bfe06340d19847bccccd362f24",
      "ca05c5da4d6b489e88449a6434bf8613",
      "c795b8564e404d2a84a42a2902f98143",
      "a4e5d70baf5e41c0bcbd74e1f6ec146c",
      "2b93c3df96394bbdbc5ef0ba05e79d76",
      "0d290c5de4b94550b8f084a8138f4e50",
      "bd885b9c8495411db50c5bd6921ba82b",
      "9e9046bc93ad40b09d7a34a6fe94f6d0",
      "cd5b8c78133c4f919ced3ec18c501380",
      "1676fd341b4d460988c5b96bb2f8f560",
      "7165aedfcbfe4719ba773eba08673e00",
      "0721aca060e0476ab85c3c119973f3ce",
      "35496ddb2cf142c3af2ceeaf52852546",
      "28b9da92e330445fada1cca66a83bf6d",
      "38451ff76a3841deb329dcd243e3b29a",
      "7a7126b9dcce4e658dcf92000d27e959",
      "b8137f3c57cd486eb1d86aeb3634cc94",
      "3907a2a82a3b488593eb06805b2f6e9e",
      "51aea3b01415445c805eac0c766b15d1",
      "62797df9b7e0437baecbb96a63b7cd1c",
      "15fb95eb0ecc4eaaa7fc5ad27de27739",
      "39cae9ccda0d41d0b469a02bb0c65aea",
      "c50443bf7fef418daf42c90634bdb690",
      "e71ab20b86454751ab4fc305668cae44",
      "8ac828995e6c44a487db581ad956c021",
      "2f7c5269c5034a199d60729d96663e9a",
      "0f6239a33874485fa196d372702ff3c6",
      "0d248c9c8ec94dffa7ffc1ceb1d53dd6",
      "6e316a41d6c441199a72c6d06f7a0f2e",
      "2dde20a315f44449925e6f1cc0bced60",
      "1a66d2b3eb8844aba46d73116b2d037b",
      "1caa560a023e45a585068c8f43e94de7",
      "c53524d0207241d197dda4cdfb95bf1f",
      "1d0a2eb6bdb14cffb0907cbc2e0bad16",
      "f0fd9fec84b8418185460ce398a15ffa",
      "a6fdf77698824bf1bcef4473bd4e547d",
      "a34659810ac74241bc752d261eaa080c",
      "cd2cb7250f7b4157b7f59ebf03a021b3",
      "4518950eb8d34b14858e3684324b04e0",
      "a1ae1f2bf15e440eb5a6556c2e16c507"
     ]
    },
    "id": "CNtQ3iYLPOAM",
    "outputId": "02c49d57-c0d2-48aa-d4c7-04e5b78ad49b"
   },
   "outputs": [],
   "source": [
    "from sentence_transformers import SentenceTransformer\n",
    "\n",
    "model = SentenceTransformer('bert-base-nli-mean-tokens')"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7292c45d",
   "metadata": {
    "id": "4gkrqfHIPOAM"
   },
   "source": [
    "We encode the sentences (producing our mean-pooled sentence embeddings) like so:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "id": "c342708e",
   "metadata": {
    "id": "jCfyDVZUPOAM"
   },
   "outputs": [],
   "source": [
    "sentence_embeddings = model.encode([a, b, c, d, e, f, g])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 58,
   "id": "404eaf14",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(7, 768)"
      ]
     },
     "execution_count": 58,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sentence_embeddings.shape"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "76487a95",
   "metadata": {
    "id": "B2Fp5POqPOAM"
   },
   "source": [
    "And calculate the cosine similarity just like before."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 60,
   "id": "84487fff",
   "metadata": {
    "id": "A0MTZD4nPOAM"
   },
   "outputs": [],
   "source": [
    "from sklearn.metrics.pairwise import cosine_similarity\n",
    "import numpy as np\n",
    "\n",
    "# calculate similarities (will store in array)\n",
    "scores = np.zeros((sentence_embeddings.shape[0], sentence_embeddings.shape[0]))\n",
    "for i in range(sentence_embeddings.shape[0]):\n",
    "    scores[i, :] = cosine_similarity(\n",
    "        [sentence_embeddings[i]],\n",
    "        sentence_embeddings\n",
    "    )[0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "id": "ca387735",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "mkKPuNPGPOAN",
    "outputId": "4d094352-313e-41a1-c809-fb4c13db42ef"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 1.00000024,  0.18692753,  0.28297687,  0.29628235,  0.27451012,\n",
       "         0.1017626 ,  0.21696253],\n",
       "       [ 0.18692753,  1.        ,  0.72058773,  0.5142895 ,  0.11749641,\n",
       "         0.1930692 ,  0.66182351],\n",
       "       [ 0.28297687,  0.72058773,  1.00000012,  0.48864433,  0.2356894 ,\n",
       "         0.17157128,  0.5599308 ],\n",
       "       [ 0.29628235,  0.5142895 ,  0.48864433,  0.99999976,  0.26985487,\n",
       "         0.3788943 ,  0.52388817],\n",
       "       [ 0.27451012,  0.11749642,  0.23568939,  0.2698549 ,  0.99999994,\n",
       "         0.23422128, -0.01599788],\n",
       "       [ 0.10176259,  0.1930692 ,  0.17157127,  0.37889427,  0.23422126,\n",
       "         1.00000012,  0.22319673],\n",
       "       [ 0.21696255,  0.66182345,  0.5599308 ,  0.52388811, -0.01599788,\n",
       "         0.22319674,  0.99999994]])"
      ]
     },
     "execution_count": 61,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "scores"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 62,
   "id": "cab8c94e",
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<AxesSubplot:>"
      ]
     },
     "execution_count": 62,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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zB8QW6tWBCt+n0fVqpXxeDw8/O97ad2mO4cPH+GRYc8z9ZP/EhISzJ49+xlc4Nh2Ys8RdmdmznYsw9ka1vCWsvrendHPx6LPXKgMa1OuVqBDCKiqBAc6hIAavzqgydaAG9LxiUCHEDDTYuzzocdXXNkH/TonZnz92336t/bx/dMDMsfHts9JERERkVyBnCbsS3osvoiIiJRKyqSIiIjYnL5gUERERMSPlEkRERGxubI6Q0WZFBERESmVlEkRERGxOU8ZzaUokyIiIiKlkjIpIiIiNqfZPSIiIiJ+pEyKiIiIzZXNESnKpIiIiEgppUyKiIiIzWlMioiIiIgfKZMiIiJic2X1W5DVSREREbE5PcxNRERExI+USREREbG5splHUSZFRERESillUkRERGxOU5BFRERE/EiZFBEREZvT7B4RERERP1ImRURExObKZh5FmRQREREppZRJERERsTnN7hERERHxI2VSREREbE6ze0RERET8SJkUERERmyubeRQ/dFIWHd3r6/+i1GpcrkagQwioGHdmoEMIqG5WeKBDCKghHZ8IdAgBNWX1a4EOIWByOjwe6BCkjFAmRURExOY0u0dERETEj5RJERERsTmrjI5KUSZFRERESiVlUkRERGxOY1JERERE/EiZFBEREZsrq0+cVSdFRETE5spmF0W3e0RERKSUUiZFRETE5srq7R5lUkRERKRUUiZFRETE5jQFWURERMSPlEkRERGxOT0WX0RERMSPlEkRERGxOY1JEREREfEjZVJERERsTmNSRERERPxImRQRERGb05gUERERET9SJkVERMTmPJbGpIiIiIj4jTIpIiIiNlc28yjKpIiIiEgppUyKiIiIzXnKaC5FmRQREREplZRJERERsbmy+sRZdVJERERsTg9zExEREfGjMpNJ6XpVZ54ePQyn08GXM2bzwX+neW1v1KQBL705nJatm/PW2El8PPHTAEVaMtpd2Z57Rw7B4XSw6LOFfPnuF17b6zSuy8Pj/4/GrRoz/bWpfDPl6/xtf7u7L9fe2gtjYOHMBcz5YLa/wy+2jt07MHTkUJxOB/Nmzufzd//ntb1e47o8+vqjNGnVhE9e+4QvJn8JQN0L6vDsu8/kl4usH8W016fx9Qff+DP8YqvT/WI6vzgIh9PBtplL2PDOHK/t9a9tT4cn/oHlsfC43KwYOZ34VdsBuOie3jS/tTtYFilbo/nlsSm4j+UEoBbnrtWVbRk44m4cTgdLZ/3A3Ilfe23v3O9yrh/6dwCOZR5l6vApHNiyj6BywTwz6yWCygXjdDpZPe93vpkwKxBV8JnhY95g6W8rCQutzjfTJwU6nBJ38ZXtGPRC7rlf8tli5pxw7i/rfwV/G9ofgKzMLD5+bgr7t+wlLCqcoRMeplpEKJbHw0+fLmLBR98HoAa+UVYHzp6yk2KMmWZZ1iBjzCOWZb3pz6DOlsPhYPi4x7n3nw8TF5PArAUf8dOCX9i9fW9+mUNp6Yx77g16XHdl4AItIQ6Hg/tG388Ltw0nOTaZ8XMmsHLRCg7sOJBf5kjaYd57YTKde3X22rd+swZce2svHu/zKK6cHEZOG8XqH1YTuzfG39U4Zw6HgwdHP8gzA58lKTaJ/373JssXrWD/jv35ZdLTDjPxhUlc1quL177Ruw/yQO+H8o8zY9U0fpu/zK/xF5dxGC4bfSfzB44jIzaFvt+PYv/CNaTtOH4OY379k/0L1wIQemE9ekz8N192f5KKkaFcdPe1fNnjKdxZOVw18d9c0LczO/73S6Cqc9aMw8GgUfcy/vZRpMQlM2L2K6xbtIqYndH5ZZIOJDBuwPNkpmfQuns77hw7lNH9n8F1LIdXB47kWGYWziAnz3wxmg1L1rL7jx0BrFHJ6n99Twbe1JdnXxof6FBKnHE4uPOlexl324ukxCUzavarrFm8ipgdx8994oF4Rv8z99xf3L0dd48dysj+T+Nxe/h09Cfs3bSb8pXK89J349n463qvfaV4jDG9gTcBJ/C+ZVnjTth+G/BU3uIR4H7Lstaf7pinu93TwRjTALjbGBNqjAkr+Dr3apS81u1bsn9PNNH7YnDluJj3zSJ69L7Cq0xKUiqb1m3BleMKUJQlp2nbZsTtjSV+fzyuHBe/zFlKp2u9OyOHkg+xc8MOXC631/q6Teuyfe1WsrOO4XF72LR8E517e/8hL+2at21GzN4Y4vbH4cpxsWT2z3Q5Sf23r99+2vPdtltbYvfFknAwwdchl6iIto1J3xvP4f2JeHLc7P52OfWv7eBVxpV5LP/n4ArloMAjs02QE2f5EIzTQVCFEDLjU/0We0m4oG0TEvbFkXggHneOi5VzfqXdtZd4ldm5dhuZ6RkA7Fq7nbDI8PxtxzKzAHAGOQkKCipzT8Hq2LY11apWCXQYPtG4bRPi98bmn/vlc36lQ89OXmV2rDl+7neu3U5YVO65T0tIZe+m3QBkZWQRszOasFrhlBWWj/+diTHGCbwDXAe0BG41xrQ8odge4ErLsi4GXgKmnOm4p7vdMwmYD1wArAGM1/uRu75UqBkZQVzM8T808TEJtG5/UQAj8q3wyHCSYhLzl5Njk2jWtnmR9t2/bR+3P3EHVapX4VhWNh2u6sjODfb6FBkeWYPEAvVPik2iRbui1b+g7n2vZMm3P5dkaH5RMSqUjNiU/OXMuBQi2jUuVK5B7450fPqfVKhRlYV3jM8rm8qmyXO5ZcWbuLKyObh0IweXbvJb7CUhtFYYKTFJ+cspsSk0btv0lOWvGHA1G5f8kb9sHA5GfvcqNRtE8uO0+exeZ6/r/3wWGhlOSmxy/nJKbDKN25363He/5Ro2FDj3f6lRN4IGFzVi17rtPonzPNUJ2GlZ1m4AY8xnQD9g818FLMsqmLZeDtQ900FPmUmxLOsty7IuBD60LOsCy7IaFXidtoNijBlijFltjFmdctT3n1KNMYXWlbEPR94KVxeriF8uFb0zmq8mfsGLM15i5LQX2btlDx63+8w7liInOd2c7XdrBQUH0bnnpSz93j63OY47yfV+kvrvm7+aL7s/yeLBE2j/xD8ACKlWkfrXtufzLsOY2eHfBFcoR+Mbu/o64JJ1st/3U1wALbq04vIBV/P5uONj1CyPhxeuf5xHuwyhUZum1GlWz2ehSsk6ya/+KRv7C7u04soBV/PZ2Kle68tVLM8jk55k+qgPOXrkaInHGCgeH7+KoA5woMBydN66UxkMzDvTQc84u8eyrPvPGFrhfaZYltXRsqyOYRVqnu3uZy0+NoHI2sf/n1q1a5IYl3iaPewtOTaZGrUj8pfDo2qQkpBymj28LZ61iEdv+D+evflpDqcdJmaPfcajQG7mJKJA/WtE1SA5Pvk0exR2yVUd2blpF2lJaSUcne9lxqZQKer4HdeKkWFkxp36lk3cim1UbVCTcqGVqd2tFYcPJJKVchjL5WbvvNXU6nDqT6KlUWpcMmG1a+Qvh0WFkXaS679uiwbcNe5+3rp3HBlpRwptP5qeybblm2h9ZTufxislJyUuOf/2DUBYVDip8YXPfb0WDbjnlQeYcM9YjhQ4984gJ49MeoJl3yxl9fwVfom5rCiYfMh7DTmxyEl2O2kX0hhzFbmdlKdOtr2gMjEFedMfW6h/QT3q1I8iKDiI6/r35KcFdvyEXDQ71m8nqlFtatarRVBwEJf3uYKVi4r+C1ctvBoANWpH0KV3F5bOttctj23rt1OnYW1q5dW/e98rWb5o+Vkdo3u/7iz5dolvAvSxxPW7qdooksr1InAEO7mgX2f2L1rrVaZKw1r5P4e3aogjJIhjqUfIiEmmZrsmOMuHAFC720Wk7Tzo1/iLa8/6ndRsGEWNujVxBgfRqU83/li02qtMWO0aPDTpCd4b9hbxe2Lz11cJq0qFqhUBCC4XQsuuFxO7y171P5/tXr+TyEZRRNTLPfed+3Rj7aJVXmXCa9fg/yY/yaRhbxJX4NwD3PPqg8TsPMi8971nw5UFlmX5+pWffMh7nTieJBoomJasCxT6BGyMuRh4H+hnWdYZP12WiSnIbrebMc+MZ/Jnb+J0Ovh65nfs2raHf96ROwXx86lfEx4RxqyFH1O5SiU8Hg+3D7mFfpffQsaRzABHf/Y8bg9Tnp/EyGmjcDgd/DBrEQe276f37dcBMH/6PKpHVOf17/5DxcoV8Xg89Bncj4euvp+jR47y1ORnqRpaBVeOm8nPTyLjUEaAa3R2PG4P7zw/kTHTR+NwOlk4ayH7tu/nhtuvB+D76XMJjQjlv9+/RcXKFbE8HvoP7s+QHveReSSTcuXL0f7ydrz59FsBrsm5sdwefn/+E3rPeBLjcLB91s+kbT9Ii9t7ALB1+o80uv4SmtzUDY/LjTsrm5/ufxuAxD92sWfuSvrPH43lcpP85z62zvgpkNU5ax63hxkj3uexqc/jcDr45fMfidlxgO63XQvAkhkL6ffwzVQOrcKg0fcC4Ha5GdX3KarVDOWe1x/C4XBiHIZV3y9j/Y9rAlmdEvfEC+NY9ccG0tLSubr/7TwweBA39ekV6LBKhMft4ZMR7/Pk1BE4nA5+/vwHDu44QI+8c//jjIX8/ZF/Ujm0Cv96KfeDvtvtZkSfJ2nWsQWX39Sd/Vv28vLc1wH4/LUZrP9p7Sn/Pzkrq4CmxphGwEHgFmBgwQLGmPrAV8Agy7KKNCDIFHUsw7lqVatzmR4ecjqNy9U4c6EyLMuy11iXkvZPq+zMHDgXvwaVnfv952LK6tcCHULA3NXh8UCHEHDT93110iE0vtKv/t98+rf22/3fnbE+xpjrgf+QOwX5Q8uyXjbGDAWwLGuSMeZ94CZgX94uLsuyOp7umGUikyIiIiKBZVnWXGDuCesmFfj5HuCeszmmOikiIiI2p+/uEREREfEjZVJERERsrihPhbUjZVJERESkVFImRURExObK6rcgK5MiIiIipZIyKSIiIjbn62eeBYoyKSIiIlIqKZMiIiJic2X1OSnqpIiIiNicpiCLiIiI+JEyKSIiIjanKcgiIiIifqRMioiIiM1pCrKIiIiIHymTIiIiYnMakyIiIiLiR8qkiIiI2JyekyIiIiLiR8qkiIiI2JxHs3tERERE/EeZFBEREZsrm3kUZVJERESklFImRURExOb0nBQRERERP1ImRURExOaUSRERERHxI2VSREREbK6sfguyzzsprctH+vq/KNUm9TgS6BACJm19oCMIrMzDKYEOIaDu23d+XwA5HR4PdAgB89Ga8YEOQcoIZVJ86HzuoIiIiP+U1TEp6qSIiIjYnL5gUERERMSPlEkRERGxubI6cFaZFBERESmVlEkRERGxubI6cFaZFBERESmVlEkRERGxOY1JEREREfEjZVJERERsTmNSRERERPxImRQRERGb0xNnRURERPxImRQRERGb82h2j4iIiIj/KJMiIiJicxqTIiIiIuJHyqSIiIjYnMakiIiIiPiRMikiIiI2pzEpIiIiIn6kTIqIiIjNaUyKiIiIiB8pkyIiImJzZXVMijopIiIiNqfbPSIiIiJ+pEyKiIiIzZXV2z3KpIiIiEippEyKiIiIzVmWJ9Ah+IQyKSIiIlIq2TqT0ubKdtzxwj04nA5++mwRsyd+5bW9a/8r6Dv0RgCyMrP44LlJ7N+yl7CoGjww4RGqR1TH8lj88OlC5n/0XSCqcM6CWl1C+YEPgMNBztJ5HJv7WaEyzuZtqDDwfnAGYR0+RMYrj+VuqFCJinc9hqNuQ7Asjn44HveuLf6tQDGVv+wSwh5/AJwOjnw9j/SPvetfrkMbar4xCldMLACZP/7KofemA2AqVyJ8xGOENG4IWCS9OJ7sDfaqf6XLO1Br+H0Yp4O0zxeQPOV/XtsrdmpN3UkjyImOA+DwwmUkvT2ToMga1H7tMYIiQsFjkTprPqmffBuIKpy1CW+M4rrePcg8epTBg4fxx7pNhco0bFiPT6e/S2hoKH+s28id/3qYnJwcmjdvzAfvTaBdu1Y8P+IV3pgwOX+fatWqMmXyeC66qDmWZXHvvY+xfMUaf1btrFx8ZTsGvXA3DqeDJZ8tZs7Er722X9b/Cv42tD+Q2+59/NyUvHYvnKETHqZaRCiWx8NPny5iwUffB6AGvjV8zBss/W0lYaHV+Wb6pECH4zeeMjomxbadFONwcNdL9zHmthdIjkvm5dmvsWbxSg7uiM4vk3AgnlH/fI6M9AzadG/PvWMf4Pn+T+Jxu5k++iP2btpN+UrlGfPd62z8dZ3XvqWacVB+0L/JGP8UVkoilUe8Q866ZXhi9h8vU6ESFQY9TMYbz2ClJGCqVD++6bYHydm0ipx3R4EzCELK+b8OxeFwEPbUv0l44Clc8YlETX+Hoz8vI2fPfq9iWes2kvjI8EK7hz3xIFnLVpH05CgICsKUt1/9I0c+wP5/PUdOXBKNvvwPh39cTvbOA17FMlf/SfSQkd77ut0kjH2frM27cFSqQMOv3yLjt7WF9i1truvdg6ZNGtGiZTcu7dSed94ey2Xd+hQqN3bMc/znrff4/PPZvPP2OO6+61YmT5lKSkoa/zfsefr1611onwlvjGLBgp8YcMsQgoODqVixgj+qdE6Mw8GdL93LuNteJCUumVGzX2XN4lXEFGi7Eg/EM/qfz5OZnsHF3dtx99ihjOz/NB63h09Hf5Lf7r303Xg2/rrea9+yoP/1PRl4U1+efWl8oEOREmDb2z1N2jYlbm8sCQficee4+H3Or3TsealXmR1rtpGRngHAzrXbCIsKByAtIZW9m3YDkJWRxcGd0YTVCvdvBYrBeUFzPAkxWImx4HaRs3IJwe26epUJ6Xw1OWt/xUpJAMA6nJa7oXxFgpq1JmfpvNxltwuOZvgx+uILadUcV3QMroOx4HKRsWAJFbp3PfOOgKlUkfLtW3Pkm7z6u1xYR+xV/woXNyN7Xww5B+Igx0X690upcnWXIu3rSkwla/MuADwZR8netZ/gWjV8GW6J6NOnF9NmfAHAipVrqVa9GpGRNQuVu6p7V778Mjc7MG3a/+jXtxcAiYnJrF6znpycHK/yVapU5vJul/LhRzMByMnJ4dChdF9WpVgat21C/N5YEvPaveVzfqVDz05eZXas2UZmfru3/ZTtXozN2r2i6ti2NdWqVgl0GH5nWZZPX4FSpEyKMebRk6w+BKyxLGtdiUZURKGRYSTHJuUvJ8cm06Rd01OW737LNaxbsrbQ+hp1a9LwogvYuW67T+L0BRNaI7/zAeBJScTZuIVXGUdkHXAGUemp1zHlK3Bs0dfkLFuEIyIKz+FDVBj8BM56jXHv287RGe9Cdpa/q3HOgiJq4Io7Xn93QiIhrVoUKleudUuiPpuMOzGZ1AmTydm9j6A6UbhTDxE+8glCmjXm2JbtpL72LlaWjeofGY6rwLWfE5dEhTbNC5Wr0LYFjWa/jSshhfhx75O90zvTFFynJuVbNubo+q0+j7m46tSOJPpATP7ywehY6tSOJK7AdRAeHkpa2iHcbjcA0QdjqV0n8rTHveCCBiQlJfPB+xO4+OKWrF27gWGPjiAz86hvKlJMoZHhpMQm5y+nxCbT+Azt3oYlfxRaX6NuBA0uasQuG7V7cn4qaialIzAUqJP3GgJ0B94zxjzpm9BOz2AKrzxFZ69ll1ZcNeAaZo6d6rW+XMXyDJv0FFNHfcDRI6WzUTq5ItTd6cTZsBkZE54j4/WnKdf3Nhy16mCcTpwNmpL90xyOjByKdSyLcjfc4peoS4w5c/2zt+7g4A0Dib3lPtI/+4aIN17M3dXpJKRFUw5/MYfYgUOxjmZR9S6b1f+k59/7DcjavJOd3f/Fnr4PkTJtNvUmPu99hIrlqfP2c8S/PAWPDa59c5JzfuKnu6KUOVGQ00m7dq2ZPHkql3TqRUZGJk89+VDxgvWhk5z5U7Z7F3ZpxZUDruazk7R7j0x6kumjPrRZuyen48Hy6StQitpJCQfaW5b1mGVZj5HbaYkArgD+dWJhY8wQY8xqY8zqnUf2llSsXlLikgmPOp6mDo8KJzU+pVC5+i0aMOSVhxh/z1iOpB3OX+8McjJs0lP89s3PrJq/3Ccx+oqVmogJO57qdoRFYKUle5dJScK1cRVkZ2EdSce9bSOOeo3xpCRipSbi3p376Tln1VKcDU79Saw0ciUkElQg1e+sGYE78YT6Z2RiHc3NjmT9thITFISjelVcCYm4ExLJ3pRb/8wflhLSwmb1j0siqMC1HxxZA1eC97XvOXIUKzO3/hk/r4agIJyhVXM3Bjmp+/ZzpM9ewuGFy/wW99m6f+idrF61kNWrFhITG0fderXzt9WpG0VMbLxX+aSkFKpXr4bT6QSgbp0oYmO8y5wo+mAs0dGxrFyVm2346qvvade2dQnXpOSkxCXn374BCDtFu1evRQPueeUBJtwzliNpR/LXO4OcPDLpCZZ9s5TV81f4JWaR4ihqJ6U+kF1gOQdoYFnWUeDYiYUty5piWVZHy7I6NqncsPhRnsSu9TuIbBRFRL2aOIOD6NKnG2sWrfQqE167BsMmP807wyYQtyfGa9uQVx8iZmc0c9+f7ZP4fMm9ZxvOmnUwNSLBGURwp+7k/OH9xybnj2UENWsFDgeElMN5QQs8sfux0lPxpCTiiKwLQFDL9nhi9gWiGucs+89tBNWrQ1DtSAgKolKv7hz92bv+jvDQ/J9DLmoOxoEnLR1Pciqu+ESCGuTWv3yn9uTssVf9j27cTkjD2gTXrQXBQVS94QoO/+Dd0XbWOF7/8hc3wzgM7tTcsRZRY/6P7F0HSPnIe1ZIaTNx0id0vORaOl5yLbNnL2DQbf8A4NJO7Uk/lO51q+cvS35exk033QDAoEE3M3vOwtP+H/HxiURHx9CsWWMAevToxpYtpfcWyO71O73avc59urF20SqvMuG1a/B/k59k0rA3idsT67XtnlcfJGbnQea9P8efYYsflNUxKaYo/7kx5nng78BfcxX7ALOB14EplmXddqp9b23Q32e1a3tVB+4YcTcOp5Mlny/mm7e/4JrbcgfKLZ6xgHtfeZBO13UhKToRAI/bzXN9Hqd5xwsZ+eVY9m/Zi8eTG96s16az7qeSnXY4qceRMxc6R0EXd6L8rXlTkH+Zz7HvPiWk+98AyF6SO506pPc/CenWCywP2Uvnkb0od4q2o15jKtz1KCYoGE9iLJkfvAaZJR9r2voSP2S+8l075U5Bdjg4Mns+6R98SuWbcut/5MvvqDKgH5X/0Qfcbqxj2aS+PpFjGzYDENysMeEjHsUEB+OKjiV55Gt4Dpd8/TMPh5T4Mf9S6cqO1HoubwryFwtJnjiL6rdeD0DazLmE3v43QgfegOXKrX/8mPc4+scWKnRoScPPxpO1dQ/kPfwp4fVPcrMtJaz1vpK9AN5682V6XdudzKNHueeeR1mzdgMAc76dypChTxAbG0+jRvXzpiBXZ936P7njzn+TnZ1NrVoRrPh9HlWrVsbj8XDkSCat23Tn8OEjtGlzEZMnvUZISDB79uxn8D2PkpZ2qNjx3hJ16ZkLnYM2V7Xn9hG5U5B//vwHZr/9JT1uuxaAH2cs5J5XHuCS6zrnt3tut5sRfZ6kWccWjPhyDPu37MXKa/c+f20G638qPFavuD5aE7iZNU+8MI5Vf2wgLS2d8LDqPDB4EDf16eX3OIJrXHDSu3O+Uif0Ip/2JA6m/unX+vylSJ0UAGNMB6AbubdFf7Usq0itmi87KaWdLzspduDLTood+LKTYgcl3UmxG191UuwgkJ2U0sLfnZSo6i19+rc2Nm1zQDopRX5OimVZa4DS+4QjERERKVNs+zA3ERERyaVvQRYRERHxI2VSREREbC6QM3B8SZkUERERKZWUSREREbE5fQuyiIiIlEq63SMiIiLiR8qkiIiI2JxHmRQRERER/1EmRURExOY0JkVERETEj5RJERERsbmyOgVZmRQREREplZRJERERsTmNSRERERHxI2VSREREbE7PSRERERHxI2VSREREbM7S7B4RERER/1EnRURExOY8luXTV1EYY3obY7YZY3YaY54+yXZjjHkrb/sGY0z7Mx1TnRQREREpFmOME3gHuA5oCdxqjGl5QrHrgKZ5ryHAxDMdV2NSREREbK4UPCelE7DTsqzdAMaYz4B+wOYCZfoBU63cYJcbY6obY6Isy4o91UGVSREREZHTMsYMMcasLvAackKROsCBAsvReevOtowXZVJERERsztezeyzLmgJMOU0Rc7LdzqGMF2VSREREpLiigXoFlusCMedQxos6KSIiIjZnWZZPX0WwCmhqjGlkjAkBbgFmn1BmNnBH3iyfzsCh041HAd3uERERsb1AD5y1LMtljHkIWAA4gQ8ty/rTGDM0b/skYC5wPbATyATuOtNx1UkRERGRYrMsay65HZGC6yYV+NkCHjybY6qTIiIiYnMBn4DsIxqTIiIiIqWSCfR9LF8zxgzJmzp1XlL9z9/6n891B9Vf9T+/619WnA+ZlBMfOHO+Uf3PX+dz3UH1V/3F9s6HToqIiIjYkDopIiIiUiqdD52U8/2epOp//jqf6w6qv+ovtlfmB86KiIiIPZ0PmRQRERGxIXVSyihjTENjzKZAxyGBZ4wZaYx5PNBxiP8YYx42xmwxxswIdCwixaEnzoqIlD0PANdZlrUn0IGIFEeZzqQYY74xxqwxxvxpjDkf58wHGWM+McZsMMZ8YYypGOiA/MUYc0devdcbY6YFOh5/M8Y8Z4zZZoxZDDQPdDz+Zoy53Riz0hizzhgz2RjjDHRM/mKMmQRcAMw2xgwLdDz+Zox53hiz1RizyBgzU1lEeyvTnRTgbsuyOgAdgYeNMeGBDsjPmgNTLMu6GEgn99NVmWeMuQh4DuhhWVYb4JEAh+RXxpgO5H5NejvgRuCSwEbkX8aYC4EBQFfLstoCbuC2gAblR5ZlDQVigKssy5oQ6Hj8yRjTEbiJ49d+x8BGJMVV1jspDxtj1gPLgXpA0wDH428HLMv6Le/n6UC3QAbjRz2ALyzLSgKwLCslwPH42+XA15ZlZVqWlQ7MDnRAfnY10AFYZYxZl7d8QUAjEn/pBnxrWdZRy7IOA3MCHZAUT5kdk2KM6Q5cA3SxLCvTGLMEKB/ImALgxPnl58t8c8P5U9dTOZ/rb4BPLMt6JtCBiN+ZQAcgJassZ1KqAal5HZQWQOdABxQA9Y0xXfJ+vhX4NZDB+NEPwD//ur1njAkLcDz+thT4uzGmgjGmCtAn0AH52Q/AP4wxNSH3/BtjGgQ4JvGPX4E+xpjyxpjKwA2BDkiKp8xmUoD5wFBjzAZgG7m3fM43W4A7jTGTgR3AxADH4xeWZf1pjHkZ+NkY4wb+AP4V2Kj8x7KstcaYWcA6YB/wS2Aj8i/LsjYbY4YDC40xDiAHeJDc90LKMMuyVhljZgPryT3fq4FDgY1KikNPnBURkTLDGFPZsqwjebMZlwJDLMtaG+i45NyU5UyKiIicf6YYY1qSOwbxE3VQ7E2ZFBERESmVyvLAWREREbExdVJERESkVFInRUREREoldVJERESkVFInRUREREoldVJERESkVPp/ez9+pZmJj3EAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<Figure size 720x648 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "import seaborn as sns\n",
    "\n",
    "plt.figure(figsize=(10,9))\n",
    "labels = ['a', 'b', 'c', 'd', 'e', 'f', 'g']\n",
    "sns.heatmap(scores, xticklabels=labels, yticklabels=labels, annot=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "de1d9ae5",
   "metadata": {},
   "source": [
    "本节完。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "b2761ef9",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.8"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}